【问题标题】:App writes to external storage without permission应用程序未经许可写入外部存储
【发布时间】:2016-09-28 02:27:58
【问题描述】:

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

<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'
        }
    }
}

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

App为什么以及如何在未经许可的情况下写入外部存储?

【问题讨论】:

  • 应用程序不会写入外部存储(您必须检查应用程序是否已向 ext.storage 写入任何内容),并且在您请求之前它不会要求您授予权限自己来
  • 是的,当然它不会询问是否不强迫它。但是该应用程序会由于缺少她没有执行的权限而引发异常。是的。该应用程序确实正在写入外部存储。我查过了。
  • 也许你正在检查类中的 if 语句中的 `android.Manifest.permission.WRITE_EXTERNAL_STORAGE`
  • 没有。直到现在我自己都没有检查任何许可。我只是使用权限并没有将其授予应用程序。现在应该不允许应用访问外部存储,但这正是应用正在做的事情。
  • 您可以尝试完全卸载并重新安装该应用程序。权限授予应该被清除。可能发生的情况是您的应用以前被自动授予权限(例如,targetSdkVersion 低于 23),然后您将应用升级到需要运行时权限的应用。

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


【解决方案1】:

在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,但在这种情况下,您将无法获得 marshmallow 的功能。

【讨论】:

  • 感谢您的工作,但我已经知道了。现在的问题是,该应用可以在没有权限的情况下写入外部存储。
  • 如果用户允许 READ_EXTERNAL_STORAGE 权限,它将不会再次询问 WRITE_EXTERNAL_STORAGE。是这种情况吗?
  • 不,不是这样。我知道权限组。
【解决方案2】:

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

您可以查看文档here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    相关资源
    最近更新 更多