当前位置: 首页 > 知识库问答 >
问题:

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

班思源
2023-03-14

我正试图通过以下方式获取文件:

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);
    }

然后在活动结果上的中:

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

根据许多线程,我应该使用数据从intent中获取文件名。getData()。getPath(),我希望的文件名是我的_文件。pdf,但我得到的是:

/document/acc=1; doc=28

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


共有2个答案

赵星华
2023-03-14

要获得真实的名称,并避免获得一个看起来像“图像: 4431”甚至只是一个数字的名称,您可以按照通用软件的建议编写代码。
下面是一个代码示例,它选择一个单独的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);
}

希望有帮助。

郜俊晤
2023-03-14

我正在取一份文件

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

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

这从来都不正确,尽管它往往适用于较旧版本的Android。

那怎么办呢?

那要看情况了。

<罢工> 如果您希望只接受文件,请集成 一个文件选择器库,而不是使用 ACTION_GET_CONTENT. 更新2019-04-06:由于Android Q禁止大多数文件系统访问,此解决方案不再实用)

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

>

  • 如果UrigetScheme()返回文件,则原始算法将正常工作

    如果UrigetScheme()返回content,请使用DocumentFile。fromSingleUri()创建一个文档文件,然后在该文档文件上html" target="_blank">调用getName()——这将返回一个用户可以识别的“显示名称”

  •  类似资料:
    • 我有一个复利计算器,但当我运行代码并在它要求时输入以下数字时: 本金:10000利率:0.02年期:10 然后选择已经设置好的“年度”,这样,如果我或用户输入该特定字符串,choice变量将自动变为1(或者如果我输入单词“季度”或“月度”,则为已经设置的其他值)。然而,我应该得到的值是:$12189.94,而得到的值却是:10200.0我的代码哪里做错了?

    • 我是机器学习和OpenCV的新手。我从Cohn-Kanade人脸数据库中为每种情绪(中性和快乐)拍摄了一组10张图像。然后,我从每个图像中提取面部特征,并将它们放入我的训练数据矩阵中,并为各自的情绪分配标签(例如:0表示中性,1表示快乐)。 我使用了gamma=0.1和C=1的RBF内核。经过训练后,我将从智能手机摄像头中提取出的面部特征用于预测。预测总是返回1。 如果我增加中性表达式的训练样本数

    • 我测试了简单的scala程序并用calac编译了它 如果我运行java-cp。;scala图书馆。“jar测试”,它工作正常。是的,scala图书馆。jar文件在同一个目录中。 这是我的清单文件manifest.txt 我用罐子cfm Test.jarmanifest.txt 如果我解压生成的测试。jar文件和打开清单文件,它不包含主类字段。因此,它不能与java-jar测试一起运行。罐子 我可以

    • 新网页设计在这里。我有一个登录表单,验证和工作完全在PHP,但当我尝试和验证使用ajax它不工作。当我运行页面时,它说无论输入到表单中,它都是成功的。我已经尝试了好几天,试图用许多不同的方法来验证它。如果有更好的方法请让我知道! php和登录表单位于同一页面 请帮忙!

    • 我正在为Java企业应用程序类开发一个项目。我有一个带有ejb模块的应用程序,它有一个类库中的“facade”类,该类库连接到一个简单的类似Twitter的数据库。所有的逻辑都运行良好,但是,当我为facade添加远程bean并尝试运行它时,应用程序崩溃,最后包含堆栈跟踪。 通过查看GlassFish输出屏幕,我发现了以下警告: 警告: ACDEPL112:以下扩展或库引用自C:\用户[proje