簡體   English   中英

在授予權限的 android sdcard 上創建文件時出現 IO 異常

[英]IO exception while creating file on android sdcard with permissions granted

我正在嘗試將文件從手機內部存儲器移動到 SD 卡。

val oldFile = File(oldPath) //oldPath is string
val newFile = File(newPath) //newPath is string

if(newFile.exists()) {
    newFile.delete()
}

newFile.parentFile.mkdirs()
newFile.createNewFile() //crashes here

// copy file code

路徑是絕對的。

舊文件路徑為:

/storage/emulated/0/Android/data/com.package/files/2ec37ce3-ca72-4a35-a6e6-2d7f8e864c6c

新文件路徑為:

/storage/48EE-C144/chosenDirectory/2ec37ce3-ca72-4a35-a6e6-2d7f8e864c6c

其中2ec37ce3-ca72-4a35-a6e6-2d7f8e864c6c是文件。

路徑是正確的,新的文件路徑是由用戶手動選擇的,外部目錄選擇器庫工作正常。

當然,應用程序要求用戶授予權限,並且在未授予權限之前不會將用戶傳遞給應用程序。

int perm = this.checkSelfPermission(permission.WRITE_EXTERNAL_STORAGE);
int perm2 = this.checkSelfPermission(permission.READ_EXTERNAL_STORAGE);

if (perm != PackageManager.PERMISSION_GRANTED || perm2 != PackageManager.PERMISSION_GRANTED) {
    /*ask for permissions and show explain dialog*/
}

清單中的 Parmissions 也被添加。

使用異常日志調用newFile.createNewFile()時應用程序崩潰:

05-07 13:02:14.995 14004-14004/com.packagename E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.packagename, PID: 14004
    java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451) 
     Caused by: java.io.IOException: Permission denied
        at java.io.UnixFileSystem.createFileExclusively0(Native Method)
        at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:280)
        at java.io.File.createNewFile(File.java:948)
        at com.packagename.backend.localApi.changePath.PathChanger.changePath(PathChanger.kt:29)
        at com.packagename.backend.localApi.changePath.PathChangeService$changePath$1.onSelect(PathChangeService.kt:49)
        at com.codekidlabs.storagechooser.fragments.ChooserDialogFragment$1.onItemClick(ChooserDialogFragment.java:169)
        at android.widget.AdapterView.performItemClick(AdapterView.java:343)
        at android.widget.AbsListView.performItemClick(AbsListView.java:1665)
        at android.widget.AbsListView$PerformClick.run(AbsListView.java:4075)
        at android.widget.AbsListView$10.run(AbsListView.java:6552)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6816)
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1563) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1451) 

需要在AndroidManifest.xml文件中添加權限。

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

我的解決方案是停止使用 java 類並遷移到存儲訪問框架

暫無
暫無

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

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