微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android 10 中的 Android 文件复制问题

如何解决Android 10 中的 Android 文件复制问题

我想将图像文件复制到作用域存储位置。用户通过任何图库应用程序选择图像文件。该应用程序的目标是 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)
                    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$1.onActivityResult(LogIssueFragment.kt:838)
        at com.beltmann.installation.ui.issues.LogIssueFragment$photoSelectLauncher$1.onActivityResult(LogIssueFragment.kt:57)
        at androidx.activity.result.ActivityResultRegistry$1.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)

请帮我解决这个问题。

解决方法

用户通过任何图库应用选择图像文件。

然后您将在 onActivityResult 中获得一个不错的 uri。使用那个 uri。

不要尝试查找文件路径。您可以直接使用

打开 uri 的输入流
InputStream is = getContentResolver().openInoutStream(uri). 

然后使用该流,就好像它是您之前使用的文件输入流一样(实际上并非如此)。

因此编写一个以 uri 作为源的复制函数。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。