【问题标题】:How to fix "No such file or directory" after selecting a file from Android?从Android中选择文件后如何修复“没有这样的文件或目录”?
【发布时间】:2019-08-28 07:06:22
【问题描述】:

我正在尝试从 android 设备中选择一个文件(csv 文件)。它在模拟器中运行良好。但是,当我在真实设备中测试时,我选择了一个 csv 文件,它一直显示“没有这样的文件或目录”。我不明白为什么它不能在真实设备上运行。我已经在清单中添加了权限。这是代码

    db=DataBaseHelper(this)
     lbl=EditText(this)
     lbl=view.findViewById(R.id.edit_master)
     noti = lbl.text.toString()
     btnimport=view.findViewById(R.id.img_import)
     btnimport.setOnClickListener {
         val fileintent=Intent(Intent.ACTION_GET_CONTENT)
         fileintent.type="text/csv"
         try {
             startActivityForResult(fileintent, requestcode)
         } catch (e: ActivityNotFoundException) {
             lbl.text="No activity can handle picking a file. Showing alternatives."
         }
     }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (data == null)
        return
    if (requestCode<=requestcode) {
        val filepath=data.data!!.path
        println(filepath)
        lbl.text = filepath
        val inputStream=FileInputStream(filepath)
        println(inputStream)
        val bb=db.writableDatabase
        val myPath = DB_PATH + REAL_DATABASE
        val db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE)
        val tableName="Master"
        db.execSQL("delete from $tableName")
        try {
            println("gg")
            if (resultCode == Activity.RESULT_OK) {
                try {
                    val file=InputStreamReader(inputStream)

                    val buffer=BufferedReader(file)
                    buffer.readLine()
                    val contentValues=ContentValues()
                    db.beginTransaction()
                    while(true) {
                        val line=buffer.readLine()
                        if (line == null) break
                        val str=line.split(",".toRegex(), 3)
                            .toTypedArray()

                        val _id1=str[0].toString()
                        val quantity1=str[1].toString()
                        val name=str[2].toString()

                        contentValues.put("_id1", _id1)
                        contentValues.put("quantity1", quantity1)
                        contentValues.put("name", name)
                        db.insert(tableName, null, contentValues)

                    }

                    db.setTransactionSuccessful()
                    db.endTransaction()
                } catch (e: IOException) {
                    if (db.inTransaction())
                        db.endTransaction()
                    val d=Dialog(this)
                    d.setTitle(e.message.toString() + "first")
                    d.show()
                }

            } else {
                if (db.inTransaction())
                    db.endTransaction()
                val d=Dialog(this)
                d.setTitle("Only CSV files allowed")
                d.show()
            }
        } catch (ex: Exception) {
            if (db.inTransaction())
                db.endTransaction()

            val d=Dialog(this)
            d.setTitle(ex.message.toString() + "second")
            d.show()
        }

    }

}

【问题讨论】:

  • val filepath=data.data!!.path 错误 - 它不指向任何现有路径 - 只需使用 data.dataContentResolver 获取 InputStream 以供阅读
  • 但是在模拟器上运行,有什么区别?
  • 好的 filepath 在你的情况下是什么?试图Log.d那个值?如果是这样,您在 logcat 上看到了什么?
  • 它显示了我选择的路径“/root/storage/emulated/0/Download/original.csv”。
  • 如果你执行adb shell ls -l /root/storage/emulated/0/Download/original.csv命令你会看到什么?

标签: android file kotlin


【解决方案1】:

最后,正如“pskink”所建议的那样,我改变了我的代码,

val filepath=data.data!!.path
    val inputStream=FileInputStream(filepath)

到这里

val filepath=data.data
val inputstream= contentResolver.openInputStream(android.net.Uri.parse(filepath.toString()))

结果很漂亮:)

【讨论】:

  • 我不明白为什么如果有人能解释我会很感激
猜你喜欢
  • 1970-01-01
  • 2019-12-29
  • 2014-10-02
  • 1970-01-01
  • 2019-07-31
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2014-10-25
相关资源
最近更新 更多