1

IAM的努力,当我在电话部署和运行这个函数返回的错误,从网址上传图片到手机的本地存储现在离子 - 打开失败:EACCES(拒绝)

appController.controller('TestCtrl',['$scope','$cordovaFileTransfer', function($scope,$cordovaFileTransfer){ 

$scope.Download = function() { 
    ionic.Platform.ready(function(){ 
     var url = "http://3.bp.blogspot.com/-XchURXRz-5c/U5ApPOrPM9I/AAAAAAAADoo/YZEj4qeSlqo/s1600/Final-Fantasy-XV-Noctis-Red-Eyes.png"; 
     var filename = url.split("/").pop(); 
     var targetPath = cordova.file.externalRootDirectory + 'Pictures/' + filename; 
     console.log(targetPath); 

      $cordovaFileTransfer.download(url, targetPath, {}, true).then(function (result) { 
       $scope.hasil = 'Save file on '+targetPath+' success!'; 
       $scope.mywallpaper=targetPath; 
      }, function (error) { 
       console.log(error); 
       $scope.hasil = 'Error Download file'+error; 
      }, function (progress) { 
       $scope.downloadProgress = (progress.loaded/progress.total) * 100; 
      }); 
    }); 
} 
}]); 

,通过调试,我发现:打开失败:EACCES(拒绝)

我还添加了许可在AndroidManifest.xml中

<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" package="com.foodhubb" xmlns:android="http://schemas.android.com/apk/res/android"> 
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:supportsRtl="true"> 
     <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize"> 
      <intent-filter android:label="@string/launcher_name"> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
</manifest> 

但错误STI会不会改变? 我错过了什么吗?请帮忙!

+0

检查我的答案,如果这可以解决您的问题,那么标记它是正确的。 – Abbas

+0

@Abbas我认为你显示的是原生android和iam在Ionic(Hybrid App)上工作的代码。 顺便说一句,我发现解决方案,直接给予权限。 – ArsalanK

+0

是的我不知道离子框架,我看到EACCESS并发布了答案,我的不好。我将删除它。 – Abbas

回答

1

你是如何解决这个问题的?

目前CordovaFileTransfer不支持这些权限(There is currently a PR open for it on GitHub

我解决我的问题,使用$cordovaFile一劈(实现这些权限)的平均时间:

//HACK - $cordovaFileTransfer doesn't support permissions so we get permission here with $cordovaFile 
$cordovaFile.createFile(externalAppPath, "permissions.dat", true) 
.then(function (success) { 
    $cordovaFile.removeFile(externalAppPath, "permissions.dat") 
    .then(function (success) { 
     // success 
     downloadPromise = $cordovaFileTransfer.download(url, targetPath, options, trustHosts); 
     downloadPromise.then(function (result) { 
     ... 
     ... 
    }, function (error) { 
     // error couldn't delete tmp file 
    }); 
}, function (error) { 
    $scope.modal.hide(); 
    $ionicPopup.alert({ 
     title: "Permission denied", 
     template: "The file could not be downloaded, permission was denied.", 
     cssClass: 'error-popup' 
    }); 
    return; 
}); 
+0

谢谢你指点我PR。我使用的是离子2,最后我发现直接使用uri from fileChooser(无需通过filePath转换)对我无任何修改。 – Luckylooke

0

这里是我的离子2版本的@Aldracor破解,如果有人想尝试。

import { Platform } from 'ionic-angular'; 
import { Transfer } from '@ionic-native/transfer'; 
import { File } from '@ionic-native/file'; 

constructor(
     private transfer: Transfer, 
     public platform: Platform, 
     private file: File, 
    ) {} 

    ngOnInit() { 

     this.platform.ready().then(() => { 
      this.file.createFile(this.file.externalApplicationStorageDirectory, "permissions.dat", true) 
       .then(() => { 
        this.file.removeFile(this.file.externalApplicationStorageDirectory, "permissions.dat") 
         .then(() => console.log('success'), error => console.error(error)); 
       }, error => console.error(error)) 

     }); 

    } 
相关问题