Android不需要权限 - Marshmallow 6.0.1 Unity

时间:2016-01-16 19:54:15

标签: android unity3d android-6.0-marshmallow android-permissions

我正在构建一个Cardboard应用程序并在Nexus 6P上进行测试。 我遇到的问题是,当我安装应用程序时,它不会要求任何权限。 在我的清单中,我有这个:

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

然后,如果我想在我的应用程序中从互联网下载一些文件,它不起作用。它甚至没有创建com。文件夹中。

我必须手动转到应用信息并检查存储权限。

这很奇怪,因为在构建GearVR的应用程序并在Note 4上进行测试时,它会要求许可(在Note 4中我使用sd卡,在Nexus 6P内部)

为什么会这样?

谢谢。

4 个答案:

答案 0 :(得分:6)

对于Android 6+,您需要在运行时请求权限,而不是启动。如果您考虑使用适用于Google Play的应用

,情况尤其如此

简而言之,您需要在巡回清单中指定权限,并在应用程序标记中包含以下内容

 <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />

然后,通过Android在运行时请求权限。

https://www.assetstore.unity3d.com/#!/content/62735

有一个很棒的小插件

答案 1 :(得分:2)

从Android 6.0(API级别23)开始,用户授予应用while the app is running的权限,而非他们安装应用时的权限。这就是您没有请求的原因对话框。

如果您需要请求权限,则需要显示请求理由并处理用户迭代结果。

来自docs

请求权限:

if (ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS)
        != PackageManager.PERMISSION_GRANTED) {
     if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity,
            Manifest.permission.READ_CONTACTS)) {

        // Show an expanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.

    } else {

        // No explanation needed, we can request the permission.

        ActivityCompat.requestPermissions(thisActivity,
                new String[]{Manifest.permission.READ_CONTACTS},
                MY_PERMISSIONS_REQUEST_READ_CONTACTS);

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

处理用户选择的选项

ActivityCompat中:

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

                // permission was granted, yay! Do the
                // contacts-related task you need to do.

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }

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

答案 2 :(得分:0)

从Android 6.0(Marshmallow)应用开始,不再像过去那样获得安装权限。您现在必须在运行时(用户可以拒绝)请求权限,并且必须能够在授予权限后的任何时候处理撤销权限。

如果您现在要使用旧行为,我相信您应该能够将目标API级别设置为22。

在此处阅读更多内容:http://developer.android.com/training/permissions/requesting.html

答案 3 :(得分:0)

要快速修复,你可以定位android 5(api等级22而不是23),权限将继续使用旧行为。

  • 请注意,如果您发布针对Android 6(级别23)api的应用,则无法在更新中弃用目标API级别。

https://developer.android.com/training/permissions/requesting.html