нельзя использовать MediaStore.Images.Media.insertImage - PullRequest
0 голосов
/ 25 октября 2018

У меня есть проект, работающий в магазине, и вдруг клиенты начинают жаловаться на невозможность захвата изображений с помощью моего приложения, хотя я не вносил никаких изменений в этой части, я просто обновляю android и делаю новую сборку для выпускане относится к захвату изображения

Это мой код

@Override
        public void saveImage(PictureTransaction xact, Bitmap bitmap) {
            String path = MediaStore.Images.Media.insertImage(getActivity().getContentResolver(), bitmap, getPhotoFilename(), null);

            if(path == null) {
                final Activity activity = getActivity();

                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(activity, getString(R.string.photo_save_error_toast), Toast.LENGTH_SHORT).show();
                        mTakePictureBtn.setEnabled(true);
                        mProgressDialog.dismiss();
                    }
                });
            } else {
                Uri contentUri = Uri.parse(path);
                final Image image = getImageFromContentUri(contentUri);

                // run the media scanner service
                // MediaScannerConnection.scanFile(getActivity(), new String[]{path}, new String[]{"image/jpeg"}, null);
                getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri));

                // the current method is an async. call.
                // so make changes to the UI on the main thread.
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ((ImagePickerActivity) getActivity()).addImage(image);
                        mTakePictureBtn.setEnabled(true);
                        mProgressDialog.dismiss();
                    }
                });
            }
        }

ошибка, которая происходит в фоновом режиме, выглядит следующим образом:

Failed to insert image
    java.lang.SecurityException: Permission Denial: writing com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=5494, uid=10570 requires android.permission.WRITE_EXTERNAL_STORAGE, or grantUriPermission()
        at android.os.Parcel.readException(Parcel.java:1693)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:135)
        at android.content.ContentProviderProxy.insert(ContentProviderNative.java:476)
        at android.content.ContentResolver.insert(ContentResolver.java:1280)
        at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:1025)
        at nl.changer.polypicker.CwacCameraFragment$DemoCameraHost.saveImage(CwacCameraFragment.java:172)
        at nl.changer.polypicker.camera.ImageCleanupTask.run(ImageCleanupTask.java:136)

Конечно, я просил READ_EXTERNAL_STORAGE , WRITE_EXTERNAL_STORAGE , CAMERA в моем приложении в манифесте, а также в праве выполнения и пользователь принимает в диалоговом окне, но все равно выдает эту ошибку

Может кто-нибудь помочь, пожалуйста?

РЕДАКТИРОВАТЬ

if (PermissionManager.getInstance().hasSelfPermissions(getActivity(), PermissionManager.getInstance().getCameraAndStoragePermissions()) == false) {

            mImageAndVideoParentLayout.setVisibility(View.GONE);
            PermissionManager.getInstance().checkForCameraAndStoragePermissions2((Fragment) this, PermissionManager.CAMERA_STORAGE_PERMISSIONS);
        } else {

            mImageAndVideoParentLayout.setVisibility(View.VISIBLE);
        }
------------------------
public boolean hasSelfPermissions(Context context, String... permissions) {
        for (String permission : permissions) {
            if (!hasSelfPermission(context, permission)) {
                return false;
            }
        }
        return true;
    }
-----------------------
public String[] getCameraAndStoragePermissions() {
        return mCameraAndStoragePermissions;
    }
-------------------------------
private String [] mCameraAndStoragePermissions = {

            Manifest.permission.READ_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.CAMERA
    };

---------------------------
public void checkForCameraAndStoragePermissions2(Fragment fragment, int requestCode) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {

            fragment.requestPermissions(mCameraAndStoragePermissions, requestCode);

        } else {
            Log.i("AMIRA", "Below M, permissions not via code");
        }
    }
--------------------------
@Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        Log.i("AMIRA", "PostAdFragment : onRequestPermissionsResult " + requestCode);

        if (requestCode == PermissionManager.LOCATION_PERMISSIONS) {
            initalizeMap();
        } else if (requestCode == PermissionManager.CAMERA_STORAGE_PERMISSIONS) {
            mImageAndVideoParentLayout.setVisibility(View.VISIBLE);
        }
    }

1 Ответ

0 голосов
/ 25 октября 2018

Вы справились с тем, что происходит, когда пользователь отказывает в разрешении или нажимает кнопку «Больше не показывать»?Вы должны отключить функции, когда разрешение отключено, или снова и снова запрашивать его до тех пор, пока оно не будет предоставлено.

РЕДАКТИРОВАТЬ:

Android теперь ограничивает разрешение WRITE_EXTERNAL_STORAGE с помощью фильтра maxSdkVersion.В некоторых случаях использования, например, когда приложение содержит зависимость, которая требует этого разрешения, maxSdkVersion делает невозможным для этих зависимостей предоставление или запрос разрешения.Решением для этих случаев является объявление инструментов: стратегия слияния манифеста node = "replace" позже в дереве зависимостей:

 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...