Разрешение времени выполнения API 26 & android.os.FileUriExposedException - PullRequest
0 голосов
/ 10 ноября 2018

Мое приложение нуждается в разрешениях ниже. Который был включен в AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.autofocus"/>

После обновления до API 26

(targetSdkVersion 26)

Некоторые функции не работают. Как мне нужно включить разрешение времени выполнения. Я использую RxPermission . Проблема в том, что большинство моих реализаций размещено в вспомогательном классе (а не в основной деятельности). когда я пытаюсь использовать вспомогательную библиотеку, получая ошибку -. Can not resolve constructor Я тоже пробовал со следующими опциями -

RxPermissions rxPermissions = новые RxPermissions ((FragmentActivity) mContext);

Как RxPermission требует Fragment в качестве цели. Можем ли мы спросить у пользователя все разрешения в основной деятельности? Пример кода поможет мне. Код проекта для ссылка

[Исправлено] Теперь я звоню от деятельности. Ссылка Код изменен - ​​

RxPermissions rxPermissions=new RxPermissions(this);
rxPermissions.request(Manifest.permission.CAMERA)
        .subscribe(granted -> {
            if (granted) {

                //LogUtil.e(LOG_TAG, "Granted external permission");
                setContentView(R.layout.activity_local_album);
                ViewGroup backGround = (ViewGroup) findViewById(R.id.background);
                MyUtil.setBackgroundBlur(backGround, this);

                initAdapter();
                assignViews();

            } else {
                // Oups permission denied
            }
        });

[Новая ошибка] Я получаю android.os.FileUriExposedException: ошибку. Код:

public void onClick(View v) {
    switch (v.getId()) {
        // 返回
        case R.id.action_back:
            myFinish();
            break;
        // 拍照
        case R.id.action_capture:
            PackageManager pm = getPackageManager();
            // FEATURE_CAMERA - 后置相机
            // FEATURE_CAMERA_FRONT - 前置相机
            if (pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) {
                // 访问相机类型
                int requestType;
                // 截取主题壁纸
                if (mRequestType != 2) {
                    requestType = REQUEST_IMAGE_CAPTURE_THEME;
                } else { // 截取二维码logo
                    requestType = REQUEST_IMAGE_CAPTURE_QRCODE_LOGO;
                }

                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                mImageUri = Uri.fromFile(MyUtil.getFileDirectory(this, "/Android/data/" +
                        getPackageName() + "/capture/temporary.jpg"));
                intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
                startActivityForResult(intent, requestType);
                overridePendingTransition(0, R.anim.zoomin);
            }

Error

 Process: com.bisw.weac, PID: 20997
android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.bisw.weac/capture/temporary.jpg exposed beyond app through ClipData.Item.getUri()
    at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958)
    at android.net.Uri.checkFileUriExposed(Uri.java:2356)
    at android.content.ClipData.prepareToLeaveProcess(ClipData.java:944)
    at android.content.Intent.prepareToLeaveProcess(Intent.java:10480)
    at android.content.Intent.prepareToLeaveProcess(Intent.java:10465)
    at android.app.Instrumentation.execStartActivity(Instrumentation.java:1616)
    at android.app.Activity.startActivityForResult(Activity.java:4564)
    at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
    at android.app.Activity.startActivityForResult(Activity.java:4522)
    at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
    at com.bisw.weac.activities.LocalAlbumActivity.onClick(LocalAlbumActivity.java:222)
    at android.view.View.performClick(View.java:6877)
    at android.widget.TextView.performClick(TextView.java:12651)
    at android.view.View$PerformClick.run(View.java:26069)
    at android.os.Handler.handleCallback(Handler.java:789)
    at android.os.Handler.dispatchMessage(Handler.java:98)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6938)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Наконец-то я могу это исправить, вызывая из основного класса.

 RxPermissions rxPermissions=new RxPermissions(this);
    rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE)
            .subscribe(granted -> {
                if (granted) {
                    customDefineBtn.setOnClickListener(this);
                    LogUtil.e(LOG_TAG, "Granted external permission");

                } else {
                    // Oups permission denied
                }
            });
0 голосов
/ 10 ноября 2018

Мое приложение нуждается ниже разрешений

Обратите внимание, что ваше приложение не может удерживать MOUNT_UNMOUNT_FILESYTEMS, если оно не подписано ключом подписи прошивки или не установлено в привилегированном разделе приложения (в основном для корневых устройств).

Можем ли мы спросить у пользователя все разрешения в основной деятельности?

У вас нет выбора, согласно документации . Согласно этим инструкциям, RxPermissions работает только в том случае, если вы запрашиваете разрешения у onCreate() вашего Activity (или, возможно, onCreate() вашего Fragment, хотя эта часть неясна).

Пример кода поможет мне

В дополнение к документации, репозиторий RxPermissions GitHub имеет пример приложения. Вот версия этого приложения v0.9.3 .

...