0

我使用 Intent 获取图片路径并将它们打开到文件中。我可以打开在“相机”文件夹中分配的文件,如“/storage/emulated/0/DCIM/Camera/IMG_20160817_232858.jpg”,但我无法在“/storage/emulated/0/Pictures/1634894_.png”等位置打开文件. 使用 file.exists() 它只是说它没有。需要说我正在使用 API 23 并且我请求 READ_EXTERNAL_STORAGE,所以这不是问题......但即使这样我也无法访问这些文件。有什么问题?

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
            Uri selectedImage = data.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(selectedImage,
                    filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            File file = new File(picturePath);
            if(file.exists()) {

            } else {

            }
            cursor.close();
        }
    }

更新:同一文件夹中的所有文件都不会发生这种情况,只是其中一些文件,但它们确实存在,因为我可以从图库中打开它们。

Update2:我使用这个 Intent。

Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(galleryIntent, RESULT_LOAD_IMG);

Update3:运行时权限:

if (Build.VERSION.SDK_INT >= 23) {
                if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED) {
                    SomeWork();
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                }
            }
            else { 
                SomeWork();
            }

清单中的权限:

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

2 回答 2

1

MediaStore索引您无法从文件系统访问的图像。列不需要DATA返回您可以使用的值。

相反,停止尝试获取 a File,并使用Uri自身

  • getContentResolver().openInputStream()得到InputStream一个
  • DocumentFile.fromSingleUri()轻松DocumentFile访问元数据(例如,MIME 类型)
于 2016-08-24T12:09:35.927 回答
0
try{
 // this works!!!
 File csvfile = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) + "/brcOrdersaved.csv");
        final String filename = csvfile.toString();

        if (!csvfile.exists()) {
            // displayMsg(context, "No Saved Order: ");
            return (false);
        } 
        FileReader fr = new FileReader(filename);
        BufferedReader reader = new BufferedReader(fr);

        String csvLine = "";
        final char Separator = ',';
        final char Delimiter = '"';
        final char LF = '\n';
        final char CR = '\r';
        boolean quote_open = false;
        if (reader.equals(null)) {
            displayMsg(context, "NULL");
            return (false);//rww 11/13/2021
        }
        int i = 0;
        while (!myendofcsvfile) {

            csvLine = reader.readLine();
            if (csvLine == null) {
                myendofcsvfile = true;

            } 
                // do stuff here
        }

        fr.close();
        fileexists = true;

    } catch (Exception e) {

        String msg = "Can not Load Saved Order ";
        fileexists = false;
        return (fileexists);

    }
于 2021-12-10T15:17:43.707 回答