亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

較新操作系統上的文件選擇器 - 找不到文件

較新操作系統上的文件選擇器 - 找不到文件

繁花不似錦 2021-12-10 15:30:35
在我的 Android 應用程序中,我需要使用文件選擇器對話框從存儲中加載一個文本文件。前段時間,我按照此Android 文件選擇器主題(原始答案)中的說明進行操作。在裝有 Android 4.2.2 (API 17) 的手機上一切正常。這段代碼(實際上是它uri.getPath()本身)返回文件的真實路徑:public static String getPath(Context context, Uri uri) throws URISyntaxException {    if ("content".equalsIgnoreCase(uri.getScheme())) {        String[] projection = { "_data" };        Cursor cursor = null;        try {            cursor = context.getContentResolver().query(uri, projection, null, null, null);            int column_index = cursor.getColumnIndexOrThrow("_data");            if (cursor.moveToFirst()) {                return cursor.getString(column_index);            }        } catch (Exception e) {            ...        }        ...    }    ...}它返回如下內容: /storage/sdcard1/Directory/myFile.txt..我可以進一步處理文件。但是,在搭載 Android 7 和 8 (API 24-26) 的手機上,cursor.getString(column_index)總是返回null,并且uri.getPath()返回路徑如下:/document/254 - Android 8(外部存儲)/document/primary:myFile.txt - Android 8(內部存儲)/document/C5F9-13FC:myFile.txt - 安卓 7...當我想處理由new File(path)BufferedReader創建的文件并使用 BufferedReader 讀取其內容時,我得到了FileNotFoundException.我不認為這是權限問題,因為當我使用以下代碼讀取帶有硬編碼路徑的文件時,一切正常:File storage = Environment.getExternalStorageDirectory();File file = new File(storage, fileName);我的問題是:有什么方法可以從文件選擇器中獲取真正的文件路徑,還是應該以完全不同的方式(例如使用外部庫)在具有較新 Android API 的設備上解決此問題?
查看完整描述

2 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

將此添加到清單文件


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

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

然后在運行時請求權限,如下所示


// Check whether this app has write external storage permission or not.

int writeExternalStoragePermission = ContextCompat.checkSelfPermission(ExternalStorageActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);

// If do not grant write external storage permission.

if(writeExternalStoragePermission!= PackageManager.PERMISSION_GRANTED)

{

    // Request user to grant write external storage permission.

    ActivityCompat.requestPermissions(ExternalStorageActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE_PERMISSION);

}

您需要在與任何外部讀取、寫入過程交互之前執行這些代碼。


查看完整回答
反對 回復 2021-12-10
?
搖曳的薔薇

TA貢獻1793條經驗 獲得超6個贊

我在這里找到了解決方案。


問題是我想使用以下代碼讀取文件:


File file = new File(intent.getData().getPath());

BufferedReader br = new BufferedReader(new FileReader(file));

相反,我應該使用這個:


InputStream is = getContentResolver().openInputStream(intent.getData());

BufferedReader br = new BufferedReader(new InputStreamReader(is));


查看完整回答
反對 回復 2021-12-10
  • 2 回答
  • 0 關注
  • 232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號