学而实习之 不亦乐乎

Android:startActivityForResult() 方法过时

2022-07-26 06:26:21

一、registerForActivityResult()用法

1、简单写法

//java写法
registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
    @Override
    public void onActivityResult(ActivityResult result) {
        Intent data = result.getData();
        int resultCode = result.getResultCode();
    }
}).launch(new Intent(context,BActivity.class));
//kotlin写法
registerForActivityResult(ActivityResultContracts.StartActivityForResult()
) {
    val data = it.data
    val resultCode = it.resultCode
}.launch(Intent(context,BActivity::class.java))


//launch()方法,输入Intent,ActivityResultCallback:获取返回的数据,
//ActivityResultContracts.StartActivityForResult 是官方提供用来处理回调数据的ActivityResultContract类
//跳转到BActivity后,调用setResult()方法传递数据,这部分和以前一样

2、常规用法

ActivityResultLauncher<Intent> intentActivityResultLauncher = registerForActivityResult(
		new ActivityResultContracts.StartActivityForResult(),
		new ActivityResultCallback<ActivityResult>() {
			@Override
			public void onActivityResult(ActivityResult result) {
				//此处是跳转的result回调方法
				if (result.getData() != null && result.getResultCode() == Activity.RESULT_OK) {

					Bundle bundle = result.getData().getExtras();
					String name = bundle.getString("name");
					String number = bundle.getString("number");
				} else {
					Toast.makeText(getApplicationContext(), "MESSAGE", Toast.LENGTH_LONG).show();
				}
			}
		});
	
Intent intent = new Intent(AActivity.this,BActivity.class);
intentActivityResultLauncher.launch(intent);

二、实例

1、调用联系人列表,获取联系人

registerForActivityResult(ActivityResultContracts.PickContact()){
    if(it != null){
        val cursor = contentResolver.query(it, null, null, null, null)
        cursor?.run {
            if(cursor.moveToFirst()){
                val name =
                    cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
                LogUtils.e("联系人姓名:$name")
                if(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) == "1"){
                    //该联系人名下存在手机号,查询方法自行实现
                }
            }
        }
    }
}.launch(null)

2、调用相机拍照

//需要WRITE_EXTERNAL_STORAGE权限
val uri = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    val values = ContentValues()
    values.put(MediaStore.MediaColumns.DISPLAY_NAME, "图片名称.jpg")
    values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
    contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values)
}else{
    FileProvider.getUriForFile(this,BuildConfig.authorities,File(externalCacheDir!!.absolutePath+"图片名称.jpg"))
}    
registerForActivityResult(ActivityResultContracts.TakePicture()){
    if(it)
        Glide.with(this).load(uri).into(binding.imageView)
}.launch(uri)

//或者可以用更简单的方法
registerForActivityResult(ActivityResultContracts.TakePicturePreview()){
    Glide.with(this).load(it).into(binding.imageView)
}.launch(null)

3、调用文件选择器选择文件

调用文件选择器,获取指定类型的文件,可在launch()方法里使用mimetype指定调用文件类型,这里以调用文本文档为例
 

registerForActivityResult(ActivityResultContracts.GetContent()){}.launch("text/plain")

如果需要选择多种文件类型,可以使用OpenDocument

registerForActivityResult(ActivityResultContracts.OpenDocument()){
    Glide.with(this).load(it).into(binding.imageView)
}.launch(arrayOf("image/*","text/plain"))

4、获取敏感权限

使用registerForActivityResult获取权限,也会变得非常简单。

获取一个权限

registerForActivityResult(ActivityResultContracts.RequestPermission()){
   if(it){
       //用户同意了该权限
   }else{
       //用户拒绝了该权限
   }

}.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)

获取多个权限

registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()){it->
    //通过的权限
    val grantedList = it.filterValues { it }.mapNotNull { it.key }
    //是否所有权限都通过
    val allGranted = grantedList.size == it.size
    val list = (it - grantedList).map { it.key }
    //未通过的权限
    val deniedList = list.filter { ActivityCompat.shouldShowRequestPermissionRationale(this, it) }
    //拒绝并且点了“不再询问”权限
    val alwaysDeniedList = list - deniedList
}.launch(arrayOf("权限1","权限2","权限3"))