应用程序未经许可即写入外部存储

时间:2016-05-30 09:50:19

标签: android android-permissions android-external-storage

我有一个使用以下权限的应用:

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

我正在为Android 6.0构建应用程序:

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "de.my.package"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

当我现在启动应用程序并写入外部存储时,即使我没有设置权限,也不会被要求获得使用Android 6.0的Nexus 5的许可:

enter image description here

为什么以及如何在未经许可的情况下将应用程序写入外部存储?

2 个答案:

答案 0 :(得分:3)

在marshmallow中,您需要在运行时询问权限,只有当用户获得权限时,您才能执行WRITE_EXTERNAL_STORAGE等操作

你可以问这样的权限

if (ContextCompat.checkSelfPermission(thisActivity,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {

        //request for the permission
        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);

        // MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    
}

您需要覆盖onRequestPermissionsResult方法以检查权限是否已归档

   @Override
        public void onRequestPermissionsResult(int requestCode,
                String permissions[], int[] grantResults) {
            switch (requestCode) {
                case MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
                    // If request is cancelled, the result arrays are empty.
                    if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED)   {

                        // permission was granted, yay! Do the
                        // write to external strage operations here

                    } else {

                        // permission denied, boo! Disable the
                        // functionality that depends on this permission.
                        /*You can forcefully again ask for the permissions to the user here but it is a bad practice*/
                    }
                    return;
                }

                // other 'case' lines to check for other
                // permissions this app might request
            }
        }

我认为在未经用户授权的棉花糖中,您将无法获得许可。
如果想要在marshmallow中没有询问和批准权限的情况下运行应用程序,那么在您的应用程序级别gradle中将目标sdk版本从23更改为22,但在这种情况下,您将无法获得棉花糖的功能。

答案 1 :(得分:0)

<块引用>

从Build.VERSION_CODES.KITKAT开始,对返回路径的读写不需要权限;呼叫应用程序始终可以访问它。这仅适用于为调用应用程序的包名称生成的路径。要访问属于其他包的路径,需要 Manifest.permission.WRITE_EXTERNAL_STORAGE 和/或 Manifest.permission.READ_EXTERNAL_STORAGE。

你可以看到文档 here