2015-11-13 58 views
1

我試圖從任何位置移動文件(包括設備內部存儲) 到SD卡,寫入SD卡始終未能

因我

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
在我的清單

,並檢查它通過檢查做的工作,如果premissions使用授權:

Contex.checkCallingOrSelfPermission("android.permission.WRITE_EXTERNAL_STORAGE")Contex.checkCallingOrSelfPermission("android.permission.READ_EXTERNAL_STORAGE")

,我已經試過3點指出錯誤的方式來做到這一點:

  1. Files.move(原件,newPath1),附帶番石榴com.google.common.io
  2. 這種方法:

    public static void move(File src, File dst) throws IOException { 
        FileInputStream inStream = new FileInputStream(src); 
        FileOutputStream outStream = new FileOutputStream(dst); 
        FileChannel inChannel = inStream.getChannel(); 
        FileChannel outChannel = outStream.getChannel(); 
        inChannel.transferTo(0, inChannel.size(), outChannel); 
        inStream.close(); 
        outStream.close(); 
    } 
    
  3. original.renameTo(newPath1);

我讀到這個SO帖子很多,而所有的解決方案我想沒有工作,我確信ŧ他安裝了SD卡,並且我沒有在嘗試時將我的設備連接到PC。我甚至用SD卡試了2個不同的設備。請注意,我可以通過BitmapFactory.decode()以完全相同的路徑訪問該圖像,並且可以將該圖像加載到imageview。

我總是得到EACCES(Permission denied)。我不知道自己還能做些什麼來解決這個:(

11-13 11:11:54.358 19192-19372/xaday.ofek.ron.xaday W/System.err: java.io.FileNotFoundException: /storage/sdcard1/DCIM/thai2/IMG-20150702-WA0001.jpg: open failed: EACCES (Permission denied) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:465) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at com.google.common.io.Files$FileByteSink.openStream(Files.java:245) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at com.google.common.io.Files$FileByteSink.openStream(Files.java:233) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at com.google.common.io.ByteSource.copyTo(ByteSource.java:248) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at com.google.common.io.Files.copy(Files.java:458) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at com.google.common.io.Files.move(Files.java:673) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at xaday.ofek.ron.xaday.XaDayIntentService.handleActionMove(XaDayIntentService.java:128) 
11-13 11:11:54.369 19192-19372/xaday.ofek.ron.xaday W/System.err:  at xaday.ofek.ron.xaday.XaDayIntentService.onHandleIntent(XaDayIntentService.java:84) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.os.Looper.loop(Looper.java:211) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.os.HandlerThread.run(HandlerThread.java:61) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.Posix.open(Native Method) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:451) 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err: ... 12 more 
11-13 11:11:54.370 19192-19372/xaday.ofek.ron.xaday W/System.err: java.io.FileNotFoundException: /storage/sdcard1/DCIM/thai2/IMG-20150702-WA0001.jpg: open failed: EACCES (Permission denied) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:465) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:87) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at java.io.FileOutputStream.<init>(FileOutputStream.java:72) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at xaday.ofek.ron.xaday.FileUtils.move(FileUtils.java:36) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at xaday.ofek.ron.xaday.XaDayIntentService.handleActionMove(XaDayIntentService.java:136) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at xaday.ofek.ron.xaday.XaDayIntentService.onHandleIntent(XaDayIntentService.java:84) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.os.Looper.loop(Looper.java:211) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at android.os.HandlerThread.run(HandlerThread.java:61) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err: Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.Posix.open(Native Method) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err:  at libcore.io.IoBridge.open(IoBridge.java:451) 
11-13 11:11:54.371 19192-19372/xaday.ofek.ron.xaday W/System.err: ... 9 more 

只是爲了確保我沒有鎖定的文件在某種程度上,我用另一個文件管理器應用程序來執行相同的文件移動 - 和它的工作!爲什麼它不是爲我工作?

任何人有一個想法

+0

是否安裝了SDCard?你可以檢查if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) – LBes

+0

是的,我確定它被安裝... –

+0

android的版本? – LBes

回答

4

在Android奇巧(4.4),谷歌已經改變了開發者如何訪問到可移動存儲(SD卡)從source.android.com報價?:

WRITE_EXTERNAL_STORAGE權限只能授予對設備上主外部存儲的寫入訪問權限 。除合併權限允許的 軟件包特定的目錄外,不得允許應用程序將 寫入輔助外部存儲設備。 以這種方式限制寫入可確保系統在卸載應用程序時清理文件 。

因此,即使使用WRITE_EXTERNAL_STORAGE權限,也無法在KitKat及更高版本的SD卡上寫入數據。

在Android Lollipop(5.0)上,Google添加了一組新的API,允許開發人員通過Storage Access Framework管理SD卡上的文件。

這StackOverflow的答案詳細解釋瞭如何使用新的API和現有的限制:

How to use the new SD card access API presented for Android 5.0 (Lollipop)?

0

就是「使用許可權」標籤中的「應用程序」標籤的外面在manifest.xml ?