【问题标题】:Android: Dialog to ask for WRITE_EXTERNAL_STORAGE not shownAndroid:询问 WRITE_EXTERNAL_STORAGE 的对话框未显示
【发布时间】:2018-03-22 16:05:59
【问题描述】:

我有一个需要以下权限才能运行的 android 应用程序。

ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE, WRITE_EXTERNAL_STORAGE, RECORD_AUDIO

我的 AndroidManifest.xml 是:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.volkswagenits.passengerapp">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION"/>


    <application
        ...
</manifest>

我的 Splash 活动是:

public class SplashActivity extends Activity {
    private static final String TAG = SplashActivity.class.getSimpleName();
    private static int SPLASH_TIME_OUT = 10000;
    private final int REQ_SOLVE_SERVICES_CODE = 15005;
    private int REQ_PERM_CODE = 1010;
    public static AudioInput AUDIO_INPUT;
    private static final String[] requiredPermissions = new String[] { ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE, WRITE_EXTERNAL_STORAGE, RECORD_AUDIO};


    private void requestPermissionIfNeeded() {
        boolean allGranted = allPermissionsGranted(this, requiredPermissions);
        if (!allGranted) {
            ActivityCompat.requestPermissions(this,
                    requiredPermissions, REQ_PERM_CODE);
        } else {
            //If all permissions are granted, check that PlayServices are available
            checkPlayServices();
        }
    }

    private void initializeGlass() {

    }




    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQ_PERM_CODE) {
            boolean allGranted = true;
            for (int result : grantResults) {
                if (result == PackageManager.PERMISSION_DENIED) {
                    allGranted = false;
                    break;
                }
            }
            if (!allGranted) {

            } else {
                //If all permissions are granted, check that PlayServices are available
                checkPlayServices();
            }
        }

    }


    private void checkPlayServices() {
        int status = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(this);
        if (status != ConnectionResult.SUCCESS) {
            if (GoogleApiAvailability.getInstance().isUserResolvableError(status)) {
                GoogleApiAvailability.getInstance().getErrorDialog(this, status, REQ_SOLVE_SERVICES_CODE).show();
            } else {
                Toast.makeText(this, "Bus Sewa can not run without GoolgeServices.", Toast.LENGTH_SHORT).show();
                finish();
            }
        } else {
            bootGlasAndContinue();

        }
    }


}

授予所有权限的代码:

public static boolean allPermissionsGranted(Context context, String[] permissions) {
    for (String perm : permissions) {
        if (ContextCompat.checkSelfPermission(context, perm) == PackageManager.PERMISSION_DENIED) {
            return false;
        }
    }
    return true;
}

当应用程序启动时,它会请求访问精细位置的权限。它确实要求允许录制音频。但是,它不会请求写入外部存储的权限。

我创建了一个小型演示应用程序。这段代码似乎在那里工作。 我错过了什么?

最终编辑:删除了不相关的代码。

【问题讨论】:

  • 为什么要两次请求 ACCESS_FINE_LOCATION 权限?正如它在 Array 中定义的那样。
  • 什么是设置 requiredPermissions = GlasAI.instance().requiredPermissions();从您获取该数组的位置检查它是否包含写入外部权限
  • @KulsDroid 我已将其删除。修改了代码。
  • @Pavan 查看编辑后的代码。是的,GlasAI.instance().requiredPermissions() 确实有 WRITE_EXTERNAL_STORAGE。无论如何,即使是硬编码也不起作用

标签: android android-permissions


【解决方案1】:

成功了:

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

曲棍球应用程序有问题。

【讨论】:

    【解决方案2】:

    问题的原因必须是使用 gradle 拉入的外部库,它有自己的清单请求类似这样的内容

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

    因此,您需要在应用清单文件中添加这样的权限

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

    这会覆盖另一个应用程序设置的权限,在您的情况下是 HockeyApp

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-08
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多