android - 使用 ActivityResultLauncher 请求 WRITE_EXTERNAL_STORAGE 时出现 ArrayOutOfBounds 异常
问题描述
我正在使用 ActivityResultLauncher 请求 Android Q 上的 WRITE_EXTERNAL_STORAGE 权限(没有android:requestLegacyExternalStorage="true"
设置),简化代码如下:
private void requestWriteStoragePermission(Fragment fragment) {
ActivityResultContracts.RequestPermission requestPermission = new ActivityResultContracts.RequestPermission();
ActivityResultLauncher<String> resultLauncher = fragment.registerForActivityResult(requestPermission, granted -> {
if (granted) {
// do stuff
} else {
// do other stuff
}
});
// vvvvvvv error happens at this line vvvvvvvvv
resultLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE);
// ^^^^^^^ error happens at this line ^^^^^^^^^
}
堆栈跟踪如下
2020-05-18 15:33:34.292 15343-15343/com.shmibblez.tones E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.shmibblez.tones, PID: 15343
java.lang.ArrayIndexOutOfBoundsException: length=0; index=0
at androidx.activity.result.contract.ActivityResultContracts$RequestPermission.parseResult(ActivityResultContracts.java:243)
at androidx.activity.result.contract.ActivityResultContracts$RequestPermission.parseResult(ActivityResultContracts.java:229)
at androidx.activity.result.ActivityResultRegistry.doDispatch(ActivityResultRegistry.java:311)
at androidx.activity.result.ActivityResultRegistry.dispatchResult(ActivityResultRegistry.java:275)
at androidx.activity.ComponentActivity.onRequestPermissionsResult(ComponentActivity.java:587)
at androidx.fragment.app.FragmentActivity.onRequestPermissionsResult(FragmentActivity.java:823)
at android.app.Activity.requestPermissions(Activity.java:5141)
at androidx.core.app.ActivityCompat.requestPermissions(ActivityCompat.java:502)
at androidx.activity.ComponentActivity$2.invoke(ComponentActivity.java:174)
at androidx.activity.result.ActivityResultRegistry$3.launch(ActivityResultRegistry.java:146)
at androidx.fragment.app.Fragment$8.launch(Fragment.java:3328)
at androidx.activity.result.ActivityResultLauncher.launch(ActivityResultLauncher.java:41)
at com.shmibblez.tones.RecyclerViews.RecyclerViewPopupMenuHandler.requestWriteStoragePermission(RecyclerViewPopupMenuHandler.java:563)
at com.shmibblez.tones.RecyclerViews.-$$Lambda$RecyclerViewPopupMenuHandler$6R45mD6L2FBu_T4i9jHebyUqt6M.onMenuItemClick(Unknown Source:6)
at android.widget.PopupMenu$1.onMenuItemSelected(PopupMenu.java:108)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:787)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:157)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:934)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:924)
at com.android.internal.view.menu.MenuPopup.onItemClick(MenuPopup.java:128)
at android.widget.AdapterView.performItemClick(AdapterView.java:374)
at android.widget.AbsListView.performItemClick(AbsListView.java:1736)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:4207)
at android.widget.AbsListView$7.run(AbsListView.java:6692)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7860)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1075)
那么如何在不崩溃的情况下请求此权限,或者由于对文件处理方式的所有更改,android Q 是否不可能?
这可能与 ActivityResultContracts.RequestPermission 处理结果的方式有关吗?堆栈跟踪中的第一行是androidx.activity.result.contract.ActivityResultContracts$RequestPermission.parseResult(ActivityResultContracts.java:243)
,这可能与我的应用程序没有android:requestLegacyExternalStorage="true"
在清单中有关吗?
解决方案
推荐阅读
- android - 当我从 Android 9.0 中的对话框构建 popupWindow 时,其 positionX 为负,popupWindow 的左侧内容被剪裁
- python - 训练中的 AWS NoCredentials
- java - 单选按钮计数不起作用,单击按钮时自动重定向到第一个活动
- python - 为什么列表元素查找在 Python 中是 O(1)?
- javascript - 使用 R 和 phantomjs 进行 Web 抓取,使用一个小的 js 脚本返回错误
- scala - scala中函数的依赖类型和依赖者
- react-native - ReactNative:未找到名称 li 的查看配置
- c++ - clang:折叠表达式和“表达式结果未使用”警告
- c - 当我 dup2 STDOUT 它需要它的所有内容
- javascript - 为什么从我的减速器返回的状态是一个空对象??(React-Redux)