onActivityResult的intent.getPath()没有给我正确的文件名

时间:2018-01-29 21:53:01

标签: android file

我试图以这种方式获取文件:

final Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT);
    String[] mimetypes = {"application/pdf"};
    chooseFileIntent.setType("*/*");
    chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE);
    if (chooseFileIntent.resolveActivity(activity
                        .getApplicationContext().getPackageManager()) != null) {
        chooseFileIntent.putExtra(Intent.EXTRA_MIME_TYPES, mimetypes);
        activity.startActivityForResult(chooseFileIntent, Uploader.PDF);
    }

然后在onActivityResult

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

根据许多线程我应该使用data.getData().getPath()从意图中获取文件名,我期待的文件名是 my_file.pdf ,但是相反,我得到了这个:

  

/文件/ ACC = 1; DOC = 28

那该怎么办?谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

  

我正在尝试获取文件

不是那个代码。该代码要求用户选择一段内容。这可能是也可能不是文件。

  

根据许多线程,我应该使用data.getData()从intent获取文件名.getPath()

这绝不是正确的,但它往往适用于旧版本的Android。

  

那该怎么办?

嗯,这取决于。

如果您只想接受文件,请整合a file chooser library,而不要使用ACTION_GET_CONTENT更新2019-04-06 :自Android以来Q禁止大多数文件系统访问,此解决方案不再实用)

如果您愿意允许用户使用ACTION_GET_CONTENT选择一段内容,请理解它不必是文件,也不必具有类似文件名的内容。最接近你会得到:

  • 如果getScheme()的{​​{1}}返回Uri,原始算法将有效

  • 如果file的{​​{1}}返回getScheme(),请使用Uri创建content,然后在其上调用DocumentFile.fromSingleUri() DocumentFile - 这应该返回一个"显示名称"这应该是用户可识别的

答案 1 :(得分:0)

要获取真实名称并避免获得看起来像“ image:4431”或什至只是数字的名称,可以按照CommonsWare的建议编写代码。
下面是一个代码示例,它选择一个pdf文件,将其名称和路径打印到日志,然后使用其uri通过电子邮件发送该文件。

private static final int FILEPICKER_RESULT_CODE = 1;
private static final int SEND_EMAIL_RESULT_CODE = 2;
private Uri fileUri;

private void chooseFile() {
    Intent fileChooser = new Intent(Intent.ACTION_GET_CONTENT);
    fileChooser.setType("application/pdf");
    startActivityForResult(Intent.createChooser(fileChooser, "Choose one pdf file"), FILEPICKER_RESULT_CODE);
}

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

    if (requestCode == FILEPICKER_RESULT_CODE) {
        if (resultCode == RESULT_OK) {
            fileUri = data != null ? data.getData() : null;
            if (fileUri != null) {
                DocumentFile d = DocumentFile.fromSingleUri(this, fileUri);
                if (d != null) {
                    Log.d("TAG", "file name: " + d.getName());
                    Log.d("TAG", "file path: " + d.getUri().getPath());
                    sendEmail(fileUri);
                }
            }
        }
    }
}

private void sendEmail(Uri path) {
    String email = "example@gmail.com";
    Intent intent = new Intent(android.content.Intent.ACTION_SEND);
    intent.setType("application/octet-stream");
    intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "PDF file");
    String[] to = { email };
    intent.putExtra(Intent.EXTRA_EMAIL, to);
    intent.putExtra(Intent.EXTRA_TEXT, "This is the pdf file...");
    intent.putExtra(Intent.EXTRA_STREAM, path);
    startActivityForResult(Intent.createChooser(intent, "Send mail..."), SEND_EMAIL_RESULT_CODE);
}

希望有帮助。