簡體   English   中英

無法通過 Kotlin 從外部存儲讀取文本文件

[英]can't read a text file from an external storage through Kotlin

我正在制作一個應用程序來通過 Kotlin 從外部存儲讀取文本文件。 即使在清單文件中添加權限標簽和更改選項后,仍會顯示以下錯誤並且無法導入文本文件。 我該如何解決這個問題?

錯誤代碼:

java.lang.IllegalArgumentException:文件內容://com.android.externalstorage.documents/document/primary%3ADocuments%2Ftest.txt 包含路徑分隔符

kotlin 文件

class MainActivity : AppCompatActivity() {

    val getTextCode:Int = 2

    override fun onCreate(savedInstanceState: Bundle?) {
        val vBinding = ActivityMainBinding.inflate(layoutInflater)
        super.onCreate(savedInstanceState)
        setContentView(vBinding.root)

        vBinding.getFromTxt.setOnClickListener {
            val downUri = Uri.parse("/storage/self/primary/Documents")
            openFile(downUri)
        }
    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if (requestCode == getTextCode && resultCode == Activity.RESULT_OK) {
            try{
                data?.data?.also { uri ->
                    Toast.makeText(this, uri.toString(), Toast.LENGTH_SHORT).show()
                    Log.d("test", uri.toString())
                    openFileInput(uri.toString()).bufferedReader().useLines{ lines->
                        Log.d("test", lines.toString())
                    }
                }
            }catch(err:Exception){
                Log.d("test", err.toString())
            }
        }
    }

    private fun openFile(pickerInitialUri: Uri){
        val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
            addCategory(Intent.CATEGORY_OPENABLE)
            type = "text/*"
            putExtra(DocumentsContract.EXTRA_INITIAL_URI, pickerInitialUri)
        }
        startActivityForResult(intent, getTextCode)
    }

}

清單文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.questionbank">

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.QuestionBank"
        android:requestLegacyExternalStorage="true"
        >
        <activity
            android:name=".EditActivity"
            android:exported="false" />
        <activity
            android:name=".TestActivity"
            android:exported="false" />
        <activity
            android:name=".PrintActivity"
            android:exported="false" />
        <activity
            android:name=".InputActivity"
            android:exported="false" />
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>



</manifest>

openFileInput(uri.toString()

方法 openFileInput() 只需要一個文件名。 不是文件路徑或完整的內容方案。 它會在 getFilesDir() 中搜索具有該名稱的文件。

如果要使用 uri 讀取文件,請打開 uri 的輸入流並從 stream 讀取。 在 Java 中:

InputStream is = getContentResolver().openInputStream(uri);

此外,您不需要任何許可即可這樣做。 您也不必更改選項,無論您的意思是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM