Я добавил разрешение для камеры в файле манифеста. Поэтому всякий раз, когда мой apk создается, он запрашивает разрешение камеры. Затем после этого я добавил код для среды выполнения write_storage_permission, но когда я создаю приложение, оно сначала запрашивает разрешение камеры, затем, если я делаю что-то, что требует разрешения на хранение, приложение вылетает, и когда я снова открываю приложение, оно запрашивает разрешение.
Итак, как я могу установить, что всякий раз, когда мое приложение создается, оно запрашивает разрешение камеры (из файла манифеста), а затем сразу после этого запрашивает разрешение write_external_storage.
<?xml version = "1.0" encoding = "utf-8"?>
<manifest xmlns:android = "http://schemas.android.com/apk/res/android"
package = "com.example.download">
<uses-permission android:name = "android.permission.INTERNET"/>
<uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name = "android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name = "android.permission.CAMERA" />
<application
android:allowBackup = "true"
android:icon = "@mipmap/ic_launcher"
android:label = "@string/app_name"
android:roundIcon = "@mipmap/ic_launcher_round"
android:supportsRtl = "true"
android:theme = "@style/AppTheme">
<meta-data android:name = "com.google.ar.core" android:value = "required" />
<activity android:name = ".MainActivity">
<intent-filter>
<action android:name = "android.intent.action.MAIN" />
<category android:name = "android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Какую версию андроида вы используете? Начиная с API 23 вы должны запрашивать разрешения во время выполнения.
@Beyazidy На самом деле я создаю проект в AR, в котором есть аркамера, которая запрашивает функцию камеры в начале. (из файла манифеста). поэтому мне просто нужно, чтобы WRITE_EXTERNAL_Storage также спросил после этого. но не могу
@IanRehwinkel да, я спрашиваю во время выполнения. но сначала мой apk проверяет разрешение камеры в начале ap, затем происходит сбой, если я пытаюсь использовать хранилище. затем при повторном открытии он запрашивает разрешение на хранение, которое я сделал с помощью кода.
Вы пытались запросить разрешение камеры в своем коде вместо файла манифеста?
Вы можете добавить несколько запросов на разрешение в одном диалоговом окне, например: ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.READ_CONTACTS /* more permissions separated with comma*/ }, MY_PERMISSIONS_REQUEST_READ_CONTACTS); (взято отсюда: developer.android.com/training/permissions/requesting
проверьте манифест. я отредактировал свой пост. разрешение камеры есть, даже если я не пишу для него код
Во-первых, проверьте, предоставлены ли разрешения, которые вам понадобятся.
int rc1 = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);
int rc2 = ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
int rc3 = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
int rc4 = ActivityCompat.checkSelfPermission(this, Manifest.permission.INTERNET);
if (rc1 == PackageManager.PERMISSION_GRANTED &&
rc2 == PackageManager.PERMISSION_GRANTED &&
rc3 == PackageManager.PERMISSION_GRANTED &&
rc4 == PackageManager.PERMISSION_GRANTED) {
allGoodProceed();
} else {
requestPermission();
}
затем вызовите метод requestPermission.
private void requestPermission() {
final String[] permissions = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA,
Manifest.permission.INTERNET};
boolean isPermissionDeniedPermanent = false;
for (int i = 0, len = permissions.length; i < len; i++) {
String permission = permissions[i];
if (ActivityCompat.checkSelfPermission(this, permissions[i]) == PackageManager.PERMISSION_DENIED) {
// user rejected the permission
boolean showRationale = shouldShowRequestPermissionRationale(permission);
if (showRationale) {
isPermissionDeniedPermanent = showRationale;
}
}
}
if (isPermissionDeniedPermanent) {
showPermissionsDialog();
} else {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,
Manifest.permission.CAMERA)) {
ActivityCompat.requestPermissions(this, permissions, HANDLE_STORAGE_PERMISSION);
}
}
}
Кроме того, переопределите метод onRequestPermissionsResult, чтобы проверить результат разрешений.
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
boolean isSomePermissionsMissing = false;
for (int i = 0, len = permissions.length; i < len; i++) {
if (ActivityCompat.checkSelfPermission(this, permissions[i]) == PackageManager.PERMISSION_DENIED) {
isSomePermissionsMissing = true;
}
}
if (isSomePermissionsMissing) {
showPermissionsDialog();
} else {
//all good proceed...
}
}
private void showPermissionsDialog() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Action required").setMessage("To proceed you have to grant some permissions");
builder.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivity(intent);
}
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog alertDialog=builder.create();
alertDialog.show();
}
Вы можете добавить разрешения для проверки, прежде чем продолжить, как вам нужно. Вернитесь назад, если это разрешит ваш запрос.
Вы должны посмотреть эта почта и ответ Джеймса Маккракена