Как добавить несколько разрешений? один из манифеста и один из времени выполнения одновременно - PullRequest
2 голосов
/ 12 марта 2019

Я добавил разрешение для камеры в моем файле манифеста. Поэтому всякий раз, когда мой 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>

1 Ответ

0 голосов
/ 12 марта 2019

Сначала проверьте, какие разрешения вам нужны.

        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();
}

Вы можете добавить разрешения, которые нужно проверить, прежде чем продолжить, как вам нужно. Пожалуйста, вернитесь назад, если это разрешит ваш запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...