Android 文件复制概率 Android 10
Android file copy prob in Android 10
我想将图像文件复制到范围存储位置。图像文件由用户通过任何图库应用程序选择。该应用程序针对 29,当我 运行 API 29 设备中的代码时,我遇到了问题。这是我的代码:
var photoSelectLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val proj = arrayOf(MediaStore.Audio.Media.DATA)
val cursor =
requireContext().contentResolver.query(imgUri, proj, null, null, null)
cursor?.let {
val columnIndex = it.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)
it.moveToFirst()
var issueImgPath = cursor.getString(columnIndex)
val selectedPhotoFile = File(issueImgPath)
if (selectedPhotoFile.length() / 1024 < 500) {
val timestamp = System.currentTimeMillis()
val mediaStorageDir = File(activity.getExternalFilesDir("Android/data/com.app.project/files/Pictures"),"Images")
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()) {
Log.d("File", "failed to create directory")
}
photoFile = File(mediaStorageDir.path + File.separator + "issue_photo_original_${timestamp}.jpg")
File(issueImgPath).copyTo(photoFile!!, true) // this line is giving problem
}
}
}
这里是logcat:
Caused by: java.io.FileNotFoundException: /storage/emulated/0/Download/download.jpeg: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileInputStream.<init>(FileInputStream.java:159)
at kotlin.io.FilesKt__UtilsKt.copyTo(Utils.kt:235)
at kotlin.io.FilesKt__UtilsKt.copyTo$default(Utils.kt:217)
at com.beltmann.installation.ui.issues.LogIssueFragment$photoSelectLauncher.onActivityResult(LogIssueFragment.kt:838)
at com.beltmann.installation.ui.issues.LogIssueFragment$photoSelectLauncher.onActivityResult(LogIssueFragment.kt:57)
at androidx.activity.result.ActivityResultRegistry.onStateChanged(ActivityResultRegistry.java:145)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3013)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:586)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1636)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3112)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3063)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3017)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:586)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1636)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3112)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3063)
at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:262)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:482)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425)
at android.app.Activity.performStart(Activity.java:7825)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
请帮我解决这个问题。
The image file is selected by user through any gallery app.
然后你会在onActivityResult中得到一个不错的uri。使用那个 uri。
不要尝试查找文件路径。您可以直接使用
打开 uri 的输入流
InputStream is = getContentResolver().openInoutStream(uri).
然后使用该流,就好像它是您之前使用的文件输入流一样(当然不是真的)。
所以写一个以uri为源的复制函数。
我想将图像文件复制到范围存储位置。图像文件由用户通过任何图库应用程序选择。该应用程序针对 29,当我 运行 API 29 设备中的代码时,我遇到了问题。这是我的代码:
var photoSelectLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
val proj = arrayOf(MediaStore.Audio.Media.DATA)
val cursor =
requireContext().contentResolver.query(imgUri, proj, null, null, null)
cursor?.let {
val columnIndex = it.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA)
it.moveToFirst()
var issueImgPath = cursor.getString(columnIndex)
val selectedPhotoFile = File(issueImgPath)
if (selectedPhotoFile.length() / 1024 < 500) {
val timestamp = System.currentTimeMillis()
val mediaStorageDir = File(activity.getExternalFilesDir("Android/data/com.app.project/files/Pictures"),"Images")
if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()) {
Log.d("File", "failed to create directory")
}
photoFile = File(mediaStorageDir.path + File.separator + "issue_photo_original_${timestamp}.jpg")
File(issueImgPath).copyTo(photoFile!!, true) // this line is giving problem
}
}
}
这里是logcat:
Caused by: java.io.FileNotFoundException: /storage/emulated/0/Download/download.jpeg: open failed: EACCES (Permission denied)
at libcore.io.IoBridge.open(IoBridge.java:496)
at java.io.FileInputStream.<init>(FileInputStream.java:159)
at kotlin.io.FilesKt__UtilsKt.copyTo(Utils.kt:235)
at kotlin.io.FilesKt__UtilsKt.copyTo$default(Utils.kt:217)
at com.beltmann.installation.ui.issues.LogIssueFragment$photoSelectLauncher.onActivityResult(LogIssueFragment.kt:838)
at com.beltmann.installation.ui.issues.LogIssueFragment$photoSelectLauncher.onActivityResult(LogIssueFragment.kt:57)
at androidx.activity.result.ActivityResultRegistry.onStateChanged(ActivityResultRegistry.java:145)
at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:354)
at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:265)
at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:307)
at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:148)
at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3013)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:586)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1636)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3112)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3063)
at androidx.fragment.app.Fragment.performStart(Fragment.java:3017)
at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:586)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300)
at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1636)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3112)
at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3063)
at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:262)
at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:482)
at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:210)
at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1425)
at android.app.Activity.performStart(Activity.java:7825)
at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
请帮我解决这个问题。
The image file is selected by user through any gallery app.
然后你会在onActivityResult中得到一个不错的uri。使用那个 uri。
不要尝试查找文件路径。您可以直接使用
打开 uri 的输入流InputStream is = getContentResolver().openInoutStream(uri).
然后使用该流,就好像它是您之前使用的文件输入流一样(当然不是真的)。
所以写一个以uri为源的复制函数。