首页 > 解决方案 > 使用 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"在清单中有关吗?

标签: androidfileandroid-permissionsandroid-fileandroid-10.0

解决方案


推荐阅读