簡體   English   中英

cordova-plugin-camera:權限被拒絕:讀取com.android.providers.media.MediaDocumentsProvider需要android.permission.MANAGE_DOCUMENTS

[英]cordova-plugin-camera: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider requires android.permission.MANAGE_DOCUMENTS

我有一個離子移動應用程序,在我的應用程序中,我希望能夠從圖庫中選擇圖像,但是選擇圖像后出現此錯誤

java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaDocumentsProvider uri content://com.android.providers.media.documents/document/image:58 from pid=2173, uid=10062 requires android.permission.MANAGE_DOCUMENTS, or grantUriPermission()

這是我的代碼,用於從圖庫中選擇圖像並將其添加

var options = {
      destinationType : Camera.DestinationType.FILE_URI,
      sourceType : Camera.PictureSourceType.PHOTOLIBRARY,
      allowEdit : false,
      encodingType: Camera.EncodingType.JPEG,
      popoverOptions: CameraPopoverOptions,
      mediaType: Camera.MediaType.PICTURE,
      correctOrientation: true
    };

   // 3
    $cordovaCamera.getPicture(options).then(function(imageData) {
   // 4
      var imagetype;
      onImageSuccess(imageData);
      function onImageSuccess(fileURI) {
        console.log("im in image success")
        console.log(fileURI)
        createFileEntry(fileURI);
      }

      function createFileEntry(fileURI) {
        console.log("im in create file entry")
        console.log(fileURI)
        window.resolveLocalFileSystemURL(fileURI, copyFile, fail);
      }

       // 5
      function copyFile(fileEntry) {
        console.log("im in file entry")
        console.log(fileEntry)
        var name = fileEntry.fullPath.substr(fileEntry.fullPath.lastIndexOf('/') + 1);
        var newName = (new Date()).getTime() + name;
         halfthru(fileEntry, newName); //diff
         getImageType(fileEntry); //diff

      }

      function getImageType(fileEntry) { //diff
        var typeImage;
        $scope.$evalAsync(function() {
          fileEntry.file(function(file){
            console.log(fileEntry.file)
            console.log(file)
            typeImage= file.type;
            $scope.imagelist = typeImage;
            imagetype = typeImage;
          }, function(e){
          });
        })

      }

     function halfthru(fileEntry, newName) {
      console.log("halftru")
        window.resolveLocalFileSystemURL(cordova.file.dataDirectory, function(fileSystem2) {
          fileEntry.copyTo(
            fileSystem2,
            newName,
            onCopySuccess,
            fail
          );
        }, fail);
      }

      // 6
      function onCopySuccess(entry) {
        console.log("im in copy success")
        console.log(entry)
          $scope.activeSlide = index;
          if(modalExists === false) {
            $ionicModal.fromTemplateUrl('image-modal.html', {
              scope: $scope,
            }).then(function(modal) {

              $scope.modal1 = modal;
              $scope.modal1.show();
              modalExists = true;
              $scope.$evalAsync($scope.images.push({file: entry.nativeURL, type: $scope.imagelist}));
              imagesModalCount =  $scope.images.length;
              attachedImageCount = $scope.imagesAttached.length;
            });
          }
          else {
            $scope.modal1.show();
            $scope.$evalAsync($scope.images.push({file: entry.nativeURL, type: $scope.imagelist}));
            imagesModalCount =  $scope.images.length;
            attachedImageCount  = $scope.imagesAttached.length;
          }

          $scope.$on('$destroy', function() {
            $scope.modal1.remove();
          });

      }

      function fail(error) {

      }
    }, function(err) {

    });

我的config.xml文件

<platform name="android">
    <icon src="resources/android/icon/drawable-ldpi-icon.png" density="ldpi"/>
    <icon src="resources/android/icon/drawable-mdpi-icon.png" density="mdpi"/>
    <icon src="resources/android/icon/drawable-hdpi-icon.png" density="hdpi"/>
    <icon src="resources/android/icon/drawable-xhdpi-icon.png" density="xhdpi"/>
    <icon src="resources/android/icon/drawable-xxhdpi-icon.png" density="xxhdpi"/>
    <icon src="resources/android/icon/drawable-xxxhdpi-icon.png" density="xxxhdpi"/>
    <splash src="resources/android/splash/drawable-land-ldpi-screen.png" density="land-ldpi"/>
    <splash src="resources/android/splash/drawable-land-mdpi-screen.png" density="land-mdpi"/>
    <splash src="resources/android/splash/drawable-land-hdpi-screen.png" density="land-hdpi"/>
    <splash src="resources/android/splash/drawable-land-xhdpi-screen.png" density="land-xhdpi"/>
    <splash src="resources/android/splash/drawable-port-ldpi-screen.png" density="port-ldpi"/>
    <splash src="resources/android/splash/drawable-port-mdpi-screen.png" density="port-mdpi"/>
    <splash src="resources/android/splash/drawable-port-hdpi-screen.png" density="port-hdpi"/>
    <splash src="resources/android/splash/drawable-port-xhdpi-screen.png" density="port-xhdpi"/>
    <splash src="resources/android/splash/drawable-port-xxhdpi-screen.png" density="port-xxhdpi"/>
    <splash src="resources/android/splash/drawable-port-xxxhdpi-screen.png" density="port-xxxhdpi"/>
    <config-file target="AndroidManifest.xml" parent="/*">
      <uses-permission platform="android" name="android.permission.MANAGE_DOCUMENTS" />
        </config-file>
  </platform>

這是在android 5.1.1手機上發生的。

我的猜測是這是由於在調用resolveLocalFileSystemURL方法時以某種方式從cordova-file-plugin引起的,但是我該如何解決呢?

它說您需要MANAGE_DOCUMENTS權限,是否已在config.xml中添加此權限?

<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />

在我的應用程序中,要添加圖庫中的圖像,請執行以下操作:

$scope.addMedia = function addMedia() {
    var buttons = [];
    var onCameraSuccess = function onCameraSuccess(imageData) {
        $scope.files.push(imageData);
    };

    var onCameraError = function onCameraError() {};

    var photoConfig = {
        quality: 70,
        targetWidth: 400,
        targetHeight: 400,
        allowEdit: false,
        destinationType: window.navigator.camera.DestinationType.DATA_URL,
        encodingType: window.navigator.camera.EncodingType.JPEG,
        saveToPhotoAlbum: false,
        mediaType: window.navigator.camera.MediaType.ALLMEDIA,
        cameraDirection: window.navigator.camera.Direction.BACK
    };

    buttons.push({
        text: 'Take a photo',
        action: function cameraUpload() {
            // Camera upload
            window.navigator.camera.getPicture(onCameraSuccess, onCameraError, angular.extend({
                sourceType: window.navigator.camera.PictureSourceType.CAMERA
            }, photoConfig));
        }
    });

    buttons.push({
        text: 'Choose a photo',
        action: function deviceUpload() {
            // Device upload
            window.navigator.camera.getPicture(onCameraSuccess, onCameraError, angular.extend({
                sourceType: window.navigator.camera.PictureSourceType.PHOTOLIBRARY
            }, photoConfig));
        }
    });

    $ionicActionSheet.show({
        buttons: buttons,
        cancelText: 'Cancel',
        cancel: function cancel() {},
        buttonClicked: function buttonClicked(index) {
            buttons[index].action();

            return true;
        }
    });
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM