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()