GVKun编程网logo

Android Crop Intent不会返回ActivityResult(android返回上一个activity)

10

本文将分享AndroidCropIntent不会返回ActivityResult的详细内容,并且还将对android返回上一个activity进行详尽解释,此外,我们还将为大家带来关于androida

本文将分享Android Crop Intent不会返回ActivityResult的详细内容,并且还将对android返回上一个activity进行详尽解释,此外,我们还将为大家带来关于android activity fragment onactivityResult问题、Android Activity Results API代替onActivityResult处理页面数据、Android onActivityResult、Android onActivityResult intent==null的相关知识,希望对你有所帮助。

本文目录一览:

Android Crop Intent不会返回ActivityResult(android返回上一个activity)

Android Crop Intent不会返回ActivityResult(android返回上一个activity)

我正在尝试从媒体库中裁剪图像.我可以访问图像,启动默认裁剪工具甚至保存裁剪的图像结果.但是,如果裁剪成功,我正在使用的意图将不会返回任何结果.

– 主要方法 –

// Crop photo intent.
Intent intent = new Intent("com.android.camera.action.CROP", null);         
intent.setData(uri);   
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("aspectX", aspectX);
intent.putExtra("aspectY", aspectY);
intent.putExtra("scale", scale);
intent.putExtra("return-data", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, createTempCroppedImageFile());
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());

// Publish intent to crop picture.
activity.startActivityForResult(intent, activity.CROP_PHOTO_REQUEST_CODE);  

– OnActivityResult()方法 –

// Photo crop activity.
if (requestCode == CROP_PHOTO_REQUEST_CODE) {
    if (resultCode == RESULT_OK) {
        Log.d(TAG, "user cropped a photo");
        signupScreen.setimage(new PhotoTool(this).getTempCroppedImageFileLocation());
    } else
        Log.d(TAG, "user cancelled photo crop");
}

如果我取消了裁剪活动,我会成功获得“用户取消的照片裁剪”消息.但是,如果我裁剪图像,新裁剪的图像将出现在目标目录中,但OnActivityResult()函数永远不会被调用.是什么赋予了??

UPDATE

看看LogCat,我发现每次保存裁剪的图像时,“JavaBinder”都会抱怨“Binding Transaction失败”.我知道这与记忆有某种关系.但裁剪文件的大小只有24KB.嗯.

解决方法:

找到了这个问题的问题.不幸的是,这是一个Android限制.

见Android cropper cannot go beyond 256?

我已将裁剪图像的输出设置为400×400.不幸的是Android的默认裁剪器只能做256×256.这非常令人沮丧,特别是当没有关于限制的文档时.

android activity fragment onactivityResult问题

android activity fragment onactivityResult问题

fragment 收不到 onActivityResult的问题

 @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
     }

若activity 中返回true,则fragment就无法收到了

Android Activity Results API代替onActivityResult处理页面数据

Android Activity Results API代替onActivityResult处理页面数据

onActivityResult

 @SuppressWarnings("deprecation")
    @Override
    @CallSuper
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        mFragments.noteStateNotSaved();
        super.onActivityResult(requestCode, resultCode, data);
    }

Activity Results API的使用

在最新beta版本中谷歌推荐使用Activity Results API来处理页面数据的处理。通过新的 Activity Result API,我们可以单独的类中处理结果回调,真正做到 单一职责 。

1.在app下的build.gradle中加入依赖:

implementation ''androidx.activity:activity-ktx:1.2.0-beta01''
implementation ''androidx.fragment:fragment-ktx:1.3.0-beta01''

2.自定义ActivityResultContract

自定义ActivityResultContract,用来处理两个activity互传数据的处理,替代onActivityResult方法 其中ActivityResultContract<String, String>第一个泛型参数表示输入的参数类型,即要带到下一个Activity的数据类型, 第二个泛型参数表示输出参数类型,即第二个Activity回传第一个Activity的数据类型。

class CustomActivityResultContract : ActivityResultContract<String, String>() {
    override fun createIntent(context: Context, input: String?): Intent {
        //要传到下一个activity中的数据,从A activity中带到B activity中的数据。
        return Intent(context, SecondActivity::class.java).putExtra("name", input)
    }
    override fun parseResult(resultCode: Int, intent: Intent?): String {
        //从activity回传的数据
        val result = intent?.getStringExtra("result") //从B activity中回传的数据。
        if (resultCode == Activity.RESULT_OK && result != null) {
            return "$result"
        }
        return ""
    }
}

3.注册ActivityResult协议

在A activity中注册ActivityResult协议,使用我们刚刚定义的CustomActivityResultContract。

registerForActivityResult方法有两个参数,第一个参数是传入对应的Contract,第二个参数是回调结果callback。

private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) {
        //第二个页面关闭后回到第一个页面的回调方法
        tvName.text = it
    }

4.调用launch方法开启界面跳转

使用第三步我们生成的启动器对象的launch方法来启动界面跳转,launch方法需要传入一个输入参数,也就是需要带到下一个页面的参数,可以是任意对象:

 btnStartSecond.setOnClickListener {
            //点击跳转到SecondActivity
            activityLauncher.launch("我是第一个页面传过去的参数")
        }

5.使用谷歌内置的 ActivityResultContract来进行页面跳转

还可以通过ActivityResultContracts类来调用谷歌为我们内置的Contract,其中包含来各种常用的Contract

  • @StartActivityForResult: 通用的Contract,不做任何转换,Intent作为输入,ActivityResult作为输出,这也是最常用的一个协定。
  • @RequestMultiplePermissions: 用于请求一组权限
  • @RequestPermission: 用于请求单个权限
  • @TakePicturePreview: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值为Bitmap图片
  • @TakePicture: 调用MediaStore.ACTION_IMAGE_CAPTURE拍照,并将图片保存到给定的Uri地址,返回true表示保存成功。
  • @TakeVideo: 调用MediaStore.ACTION_VIDEO_CAPTURE 拍摄视频,保存到给定的Uri地址,返回一张缩略图。
  • @PickContact: 从通讯录APP获取联系人
  • @GetContent: 提示用选择一条内容,返回一个通过ContentResolver#openInputStream(Uri)访问原生数据的Uri地址(content://形式) 。默认情况下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的内容。
  • @CreateDocument: 提示用户选择一个文档,返回一个(file:/http:/content:)开头的Uri。
  • @OpenMultipleDocuments: 提示用户选择文档(可以选择多个),分别返回它们的Uri,以List的形式。
  • @OpenDocumentTree: 提示用户选择一个目录,并返回用户选择的作为一个Uri返回,应用程序可以完全管理返回目录中的文档。

一般情况下使用StartActivityForResult就可以满足大部分需求啦。

 private val activityResultLauncher =
        registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            if (it.resultCode == RESULT_OK) {
                val result = intent?.getStringExtra("result")
                tvName.text = result
            }
        }
   btnStartSecond.setOnClickListener {
            //点击跳转到SecondActivity
            val intent = Intent(this, SecondActivity::class.java)
            intent.putExtra("name", "我是第一个页面传过去的参数")
            activityResultLauncher.launch(intent)
        }

使用系统内置的ActivityResultContract可以很方便的实现页面间传值来,这样也可以实现解偶操作了。

到此这篇关于Android Activity Results API代替onActivityResult处理页面数据的文章就介绍到这了,更多相关Android Activity Results API内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

您可能感兴趣的文章:
  • Android Activity View加载与绘制流程深入刨析源码
  • Android Activity启动流程刨析
  • Android开发Activity毛玻璃背景效果
  • Android开发Activity的生命周期详解
  • Android巧用Fragment解耦onActivityResult详解
  • Android中两个类让你再也不用实现onActivityResult()
  • Android onActivityResult和setResult方法详解及使用

Android onActivityResult

Android onActivityResult

对于 intent 主要的分类主要包括隐式意图和显式意图。显式意图通常主要是启动本应用中的 Activity 之间的数据,
而隐式意图则常见于启动系统中的某些特定的动作,比如打电话,或者是跨应用的 Activity 启动。
一般来说:
显式意图:调用 Intent.setComponent () 或 Intent.setClass () 方法明确指定了组件名的 Intent 为显式意图,显式意图明确指定了 Intent 应该传递给哪个组件。
隐式意图:没有明确指定组件名的 Intent 为隐式意图。 Android 系统会根据隐式意图中设置的动作 (action)、类别 (category)、
数据(URI 和数据类型)找到最合适的组件来处理这个意图。
1、MainActivity 里面的主要代码
(1)当需要返回值时,那么在启动另一个 Activity 时要用到 startActivityForResult (intent, REQUEST_CODE);
注意第二个参数是请求的 int 类型的值,这个值要在 onActivityResult () 方法中和 requestCode 做判断的,
由此来判断是启动的某个 Activity。
(2)onActivityResult () 方法中的第二个参数就是 SecondActivity 传回来的键,
第三个参数就是 SecondActivity 传回来的键对应的值。

  finalint RESULT_CODE=101;
    final int REQUEST_CODE=1;
    public void enterSecond(Viewview) {
        Intent intent=new Intent(this,SecondActivity.class);
        startActivityForResult(intent, REQUEST_CODE);
    }

    @Override
    protected void onActivityResult(int requestCode,int resultCode, Intent data){
        Log.i(TAG,"onActivityResult"+"requestCode"+requestCode+"\n resultCode="+resultCode);
        if(requestCode==REQUEST_CODE){
            if(resultCode==RESULT_CODE){
                String result=data.getStringExtra("second");
                textView.setText(result);
           }
       }
       super.onActivityResult(requestCode, resultCode, data);
    }

2、SecondActivity 类中的代码:
这个里面的 RESULT_CODE、intent 分别跟上段代码中 onActivityResult () 方法中的第二个、第三个参数相对应。

finalint RESULT_CODE=101;
    public void closeButton(Viewview) {
        Intent intent=new Intent();
        intent.putExtra("second","I am second!");
        setResult(RESULT_CODE, intent);
        finish();
    }

3、除此之外,onActivityResult () 方法中的第二个参数 resultCode 还有系统自带的一些参数,也就是说,如果我们启动的 intent 是隐式意图,那么可以用 Activity 类中 RESULT_OK 来表示操作已经顺利结束。
例如,调用系统图库的返回,请看代码:

final int CROP_PIC_REQUESTCODE = 23;
final int SELECT_PICTURE = 21;
if(resultCode == RESULT_OK&& requestCode== SELECT_PICTURE){
            System.out.println("调用图库返回,关闭activity");
            Intent intent1 =new Intent("com.android.camera.action.CROP");
            intent1.setDataAndType(data.getData(),"image/*");
            intent1.putExtra("crop","true");
            intent1.putExtra("aspectX", 1);
            intent1.putExtra("aspectY", 1);
            intent1.putExtra("outputX", 80);
            intent1.putExtra("outputY", 80);
            intent1.putExtra("return-data", true);
            startActivityForResult(intent1, CROP_PIC_REQUESTCODE);
        }

Android onActivityResult intent==null

Android onActivityResult intent==null

首先我先描述一下常规步骤:


1.启动一个新activity

startActivityForResult(intent, 3);


2.结束新启动的activity 放置数据

Intent intent = new Intent();
intent.putExtra("isDel", false);
setResult(Activity.RESULT_OK, intent);

3.接收数据

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 3 ) { 

data.getBooleanExtra("isDel", false);

//你的操作

}
}

今天遇到的问题是 在第三步 无法获取 data ,data一直为null

怎么回呢 第一次使用就出问题,不太甘心,又看了一遍代码,发现了问题所在,

我在填写数据之前,调用了 this.finish(); 看来我还是有些粗心!大家注意不要犯这个小错误~,错误虽然低级,但是也要防着点!

祝大家code no bug!

关于Android Crop Intent不会返回ActivityResultandroid返回上一个activity的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android activity fragment onactivityResult问题、Android Activity Results API代替onActivityResult处理页面数据、Android onActivityResult、Android onActivityResult intent==null等相关知识的信息别忘了在本站进行查找喔。

本文标签: