为了账号安全,请及时绑定邮箱和手机立即绑定

较新操作系统上的文件选择器 - 找不到文件

较新操作系统上的文件选择器 - 找不到文件

繁花不似锦 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 关注
  • 187 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信