cat_dog_orange 2023-04-18 17:14 采纳率: 36.4%
浏览 27

ImagePath转换为Uri显示在ImageView中报错: open failed: EACCES (Permission denied)

Android Studio 中通过相机/相册获取图片,将图片显示在EditText中,并将图片的路径保存在SQLite数据库中,从sql数据库中取出该路径后,将其转换为uri显示在另一个ImageView控件中,报错: java.io.FileNotFoundException: /storage/emulated/0/Download/Browser/8057389_8057389_1308493783296_mthumb.jpg: open failed: EACCES (Permission denied)。求大佬指导
报错如下:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.demo2.android, PID: 14618
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.demo2.android/com.demo2.android.activity.InfoSheet}: java.io.FileNotFoundException: /storage/emulated/0/Download/Browser/8057389_8057389_1308493783296_mthumb.jpg: open failed: EACCES (Permission denied)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3869)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011)
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:111)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2466)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loopOnce(Looper.java:240)
        at android.os.Looper.loop(Looper.java:351)
        at android.app.ActivityThread.main(ActivityThread.java:8364)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013)
     Caused by: java.io.FileNotFoundException: /storage/emulated/0/Download/Browser/8057389_8057389_1308493783296_mthumb.jpg: open failed: EACCES (Permission denied)
        at libcore.io.IoBridge.open(IoBridge.java:574)
        at java.io.FileInputStream.<init>(FileInputStream.java:160)
        at java.io.FileInputStream.<init>(FileInputStream.java:115)
        at android.content.ContentResolver.openInputStream(ContentResolver.java:1542)
        at com.demo2.android.activity.InfoSheet.initInfo(InfoSheet.kt:48)
        at com.demo2.android.activity.InfoSheet.onCreate(InfoSheet.kt:27)
        at android.app.Activity.performCreate(Activity.java:8397)
        at android.app.Activity.performCreate(Activity.java:8370)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1403)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3842)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:111) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2466) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:240) 
        at android.os.Looper.loop(Looper.java:351) 
        at android.app.ActivityThread.main(ActivityThread.java:8364) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013) 
     Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
        at libcore.io.Linux.open(Native Method)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
        at libcore.io.BlockGuardOs.open(BlockGuardOs.java:274)
        at libcore.io.ForwardingOs.open(ForwardingOs.java:563)
        at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8243)
        at libcore.io.IoBridge.open(IoBridge.java:560)
        at java.io.FileInputStream.<init>(FileInputStream.java:160) 
        at java.io.FileInputStream.<init>(FileInputStream.java:115) 
        at android.content.ContentResolver.openInputStream(ContentResolver.java:1542) 
        at com.demo2.android.activity.InfoSheet.initInfo(InfoSheet.kt:48) 
        at com.demo2.android.activity.InfoSheet.onCreate(InfoSheet.kt:27) 
        at android.app.Activity.performCreate(Activity.java:8397) 
        at android.app.Activity.performCreate(Activity.java:8370) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1403) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3842) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4011) 
        at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:111) 
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2466) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loopOnce(Looper.java:240) 
        at android.os.Looper.loop(Looper.java:351) 
        at android.app.ActivityThread.main(ActivityThread.java:8364) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:584) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1013

将图片上传到sql数据库代码:

private fun getInformation() {
        //获取EditText输入框中输入的信息
        val name = plantName.text.toString().trim()
        val date = takeCalendar.text.toString().trim()
        val time = detailedTime.text.toString().trim()
        val jingWeiDu = gainLongitudeAndLatitude.text.toString().trim()
        val address = takeSpot.text.toString().trim()
        val habitInfo = habitatType.text.toString().trim()
        val person = recordPerson.text.toString().trim()
        val remark = remark.text.toString().trim()
        val picturePath = plantPicture.text.toString()
        Log.d("PicturePath", picturePath)
        //上传到Android studio内置的SQLite数据库中
        uploadSQLite(name, picturePath, date, time, jingWeiDu, address, habitInfo, person, remark)
        //将文件上传到oss
        uploadFileTest(name, date, time, picturePath)

    }

    private fun uploadSQLite(name: String, path: String, date: String, time: String, weiDu: String, add: String, habit: String, person: String, remark: String,) {
        val db = mHelper?.writableDatabase
        val values = ContentValues().apply {
            put("plantName", name)
            put("plantPicture", path)
            put("takePhotoDate", date)
            put("takePhotoTime", time)
            put("takePhotoJW", weiDu)
            put("takePhotoSpot", add)
            put("takePhotoHabitat", habit)
            put("takePhotoPerson", person)
            put("infoRemark", remark)
        }
        val result = db?.insert("PlantInfo", null, values)
        println(result)
    }

从数据库中取出path变为uri代码:

private fun initInfo() {
        val db = mHelper?.writableDatabase
        val cursor = db?.query("PlantInfo", null, null, null, null, null, null)
//        val cursor = db?.rawQuery("select * from PlantInfo", null)
        if (cursor != null && cursor.count >= 1) {
            if(cursor.moveToFirst()) {
                do {
                    **val pic = cursor.getString(cursor.getColumnIndexOrThrow("plantPicture"))**
                    val name = cursor.getString(cursor.getColumnIndexOrThrow("plantName"))
                    val person = cursor.getString(cursor.getColumnIndexOrThrow("takePhotoPerson"))
                    val time = cursor.getString(cursor.getColumnIndexOrThrow("takePhotoDate"))
                    val add = cursor.getString(cursor.getColumnIndexOrThrow("takePhotoJW"))
                    //将照片显示出来
                    **val uri = Uri.fromFile(File(pic))
                    val bitmap = BitmapFactory.decodeStream(contentResolver.openInputStream(uri))**
                 
                    val infoStore = InfoQuery(bitmap, name, person, time, add)
                    infoQueryList.add(infoStore)
                } while (cursor.moveToNext())
            }
        } else {
            nothingInfo.visibility = View.VISIBLE
            displayList.visibility = View.GONE
            nothingInfo.text = "暂无数据"  //如果没有数据只显示一个提示性质的"暂无数据的"TextVew
        }
        cursor?.close()

  • 写回答

2条回答 默认 最新

  • wanglp@ 2023-04-18 18:28
    关注

    1、sd卡的读写权限打开了吗?
    2、targetsdk的版本是多少,29吗?
    3、清单文件application节点加入android:requestLegacyExternalStorage="true"

    评论

报告相同问题?

问题事件

  • 创建了问题 4月18日

悬赏问题

  • ¥50 python批量提取发票的信息
  • ¥15 mysql安装,初始化数据库失败
  • ¥15 虚幻五引擎内容如何上传至网盘?
  • ¥15 使用mmpose库时出现了问题
  • ¥15 IRI2016模型matlab运行报错
  • ¥50 bat怎么设置电脑后台自动点击网页指定词运行脚本,输入指定网页链接,指定点击词,指定间隔时间,指定网页出现的词,指定网页出现词出现后后点击锁定,放在后台运行不影响前台鼠标工作
  • ¥20 20CrMnMo的高温变形抗力
  • ¥15 RTX3.6 5565驱动中断报错
  • ¥50 带防重放token(Antireplay-Token)的网站怎么用Python发送请求
  • ¥15 visa版本没问题,串口调试助手调试串口正常使用,但是labview刷新不出来