代码之家  ›  专栏  ›  技术社区  ›  svkaka

在瞄准android O(26)8.0之后,如何拥有读写外部存储

  •  4
  • svkaka  · 技术社区  · 6 年前

    在针对android之前,下面的O代码工作得很好。设置targetApi=27(8.1)后,此操作停止工作。

    context.requestPermissions(new String[]{
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            requestCode);
    

    我看到了一个大家都知道的权限对话框,我很乐意允许应用程序访问设备上的照片、媒体和文件。

    并且在 onRequestPermissionResult() 它返回

    android.permission.READ_EXTERNAL_STORAGE == 0, 
    android.permission.WRITE_EXTERNAL_STORAGE == -1
    

    我遵循了这个答案 https://stackoverflow.com/a/48353465/4858147 不起作用。

    当我在寻找解决方案时,发现了这个 https://developer.android.com/about/versions/oreo/android-8.0-changes.html#rmp 读了这篇文章后,我并没有变得更聪明,但我百分之百肯定这是原因。

    如果应用程序针对Android 8.0(API级别26),则系统仅授予 当时读取\u EXTERNAL\u存储;但是,如果应用程序稍后请求 WRITE\u EXTERNAL\u存储,系统会立即授予该权限 不提示用户。

    我试着只请求阅读许可( 对话框->允许 )后来我申请了书面许可( 无对话框->仍未授予 )它不起作用。

    清单:

    <!-- Internet Permissions -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
    <!-- I added now, -->
    <uses-permission android:name="android.permission.CAMERA"/>
    
    <!-- Storage Permissions -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    <!-- Account Access Permission -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    
    <!-- Vibrate used for notification updates -->
    <uses-permission android:name="android.permission.VIBRATE" />
    

    我需要许可

    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    intent.putExtra("output", outputDestination);
    
    2 回复  |  直到 6 年前
        1
  •  4
  •   svkaka    6 年前

    好吧,我终于知道发生了什么,在阅读之后 https://stackoverflow.com/a/49709872/4858147 我终于可以继续了。

    问题是HockeyApp在清单中有:

    <uses-permission
        android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="18" />
    

    合并清单后,应用程序中没有WRITE\u EXTERNAL\u存储权限。由于android系统中的一个bug,该应用程序以前可以正常运行

    Android 8.0(API level 26)之前,如果应用程序请求权限 在运行时,如果授予了权限,系统也会出现错误 已向应用程序授予属于同一应用程序的其余权限 权限组,并且已在清单中注册。

    由于Android系统中的bug,它以前可以正常工作,因为我们需要阅读权限

    我所做的只是在我的主应用程序清单中更改了

     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        tools:remove="android:maxSdkVersion" />
    
        2
  •  0
  •   Ali Reza Zarghi    3 年前
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:remove="android:maxSdkVersion"/>
    

    和添加

    android:requestLegacyExternalStorage="true" 
    

    至应用程序