Android:startActivityForResult() 方法过时
一、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"))