Android:未显示要求 WRITE_EXTERNAL_STORAGE 的对话框
Android: Dialog to ask for WRITE_EXTERNAL_STORAGE not shown
我有一个 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 activity 是:
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;
}
应用程序启动时会请求访问精确位置的权限。它确实要求获得录制音频的许可。但是,它不要求写入外部存储的权限。
我创建了一个小型演示应用程序。这段代码似乎在那里工作。
我错过了什么?
最终编辑:删除了不相关的代码。
有效:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
Hockey 应用程序有问题。
问题的原因一定是使用 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
我有一个 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 activity 是:
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;
}
应用程序启动时会请求访问精确位置的权限。它确实要求获得录制音频的许可。但是,它不要求写入外部存储的权限。
我创建了一个小型演示应用程序。这段代码似乎在那里工作。 我错过了什么?
最终编辑:删除了不相关的代码。
有效:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
Hockey 应用程序有问题。
问题的原因一定是使用 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