java - Android - onRequestPermissionsResult() 已弃用。有没有其他选择?
问题描述
我试图实现从存储中写入和读取的请求权限。一切正常,但今天 Android 向我展示了 onRequestPermissionsResult(...) 方法已被弃用。StackOverflow 中有很多关于这个主题的问题,但不幸的是,它们已经过时了。
我在片段中调用了以下方法。
建议简单地调用:
requestPermissions(new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
StorageKeys.STORAGE_PERMISSION_CODE)
而不是我的方法:
ActivityCompat.requestPermissions(getActivity(),
new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
StorageKeys.STORAGE_PERMISSION_CODE))
但他们都表明 onRequestPermissionsResult(...) 已被弃用。
这是我的 onRequestPermissionsResult(...) 方法:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
if (requestCode == StorageKeys.STORAGE_PERMISSION_CODE) {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
exportBibTex.createBibFile();
exportBibTex.writeBibFile(exportBibTex
.getBibDataLibrary(libraryModel, bookDao, noteDao));
Toast.makeText(getContext(),
getString(R.string.exported_file_stored_in) + '\n'
+ File.separator + StorageKeys.DOWNLOAD_FOLDER + File.separator + fileName
+ StorageKeys.BIB_FILE_TYPE, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(getContext(), R.string.storage_permission_denied,
Toast.LENGTH_SHORT).show();
}
}
}
这是一个简单的警报对话框,我在其中调用 onRequestPermissionsResult(...):
private void showRequestPermissionDialog() {
AlertDialog.Builder reqAlertDialog = new AlertDialog.Builder(getContext());
reqAlertDialog.setTitle(R.string.storage_permission_needed);
reqAlertDialog.setMessage(R.string.storage_permission_alert_msg);
reqAlertDialog.setPositiveButton(R.string.ok,
(dialog, which) -> ActivityCompat.requestPermissions(getActivity(),
new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE},
StorageKeys.STORAGE_PERMISSION_CODE));
reqAlertDialog.setNegativeButton(R.string.cancel,
(dialog, which) -> dialog.dismiss());
reqAlertDialog.create().show();
}
我可以使用 onRequestPermissionsResult(...) 的替代方法吗?
解决方案
onRequestPermissionsResult()
方法在androidx.fragment.app.Fragment
.
所以你改用registerForActivityResult()
方法onRequestPermissionsResult()
。
你可以参考这个网址。
以下是 kotlin 代码。但你可以参考它。
val permReqLuncher = registerForActivityResult(ActivityResultContracts.RequestPermission()){
if (it) {
// Good pass
} else {
// Failed pass
}
}
我从以下 URL 添加了 java 代码。
如何在新的 ActivityResult API (1.3.0-alpha05) 中获取权限请求?
private ActivityResultLauncher<String> mPermissionResult = registerForActivityResult(
new ActivityResultContracts.RequestPermission(),
new ActivityResultCallback<Boolean>() {
@Override
public void onActivityResult(Boolean result) {
if(result) {
Log.e(TAG, "onActivityResult: PERMISSION GRANTED");
} else {
Log.e(TAG, "onActivityResult: PERMISSION DENIED");
}
}
});
// Launch the permission window -- this is in onCreateView()
floatingActionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mPermissionResult.launch(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
}
});
您可以请求多个权限。
val requestMultiplePermissions = registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->
permissions.entries.forEach {
Log.e("DEBUG", "${it.key} = ${it.value}")
}
}
requestMultiplePermissions.launch(
arrayOf(
Manifest.permission.READ_CONTACTS,
Manifest.permission.ACCESS_FINE_LOCATION
)
)
推荐阅读
- python - 使用另一个没有自我的类的 Python 方法
- mongodb - 如何使用 Python 中的结构化火花流使用 ForeachWriter 将行插入到 Mongodb?
- python - ValueError:关闭文件python烧瓶上的I / O操作
- r - 如何使R脚本跳转到下一行?
- mysql - 在一个 SQL 查询中合并两个表中的两列,并使用表中的值作为列名
- typescript - Typescript:属性类型通配符
- android - “重新启动接收器”无法正常工作 android [Xamarin.Android]
- javascript - 设置值属性时无法在文本区域中输入文本 - React
- python-3.x - 带循环的假值
- asp.net - 使用 asp.net websrevices (.asmx) 时是否需要特定权限才能访问特定方法?