Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onActivityResult';s intent.getPath()不';I don’我不能给我正确的文件名_Android_File - Fatal编程技术网

Android onActivityResult';s intent.getPath()不';I don’我不能给我正确的文件名

Android onActivityResult';s intent.getPath()不';I don’我不能给我正确的文件名,android,file,Android,File,我正在尝试通过以下方式获取文件: final Intent chooseFileIntent = new Intent(Intent.ACTION_GET_CONTENT); String[] mimetypes = {"application/pdf"}; chooseFileIntent.setType("*/*"); chooseFileIntent.addCategory(Intent.CATEGORY_OPENABLE); if (chooseFileI

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

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);
}
根据许多线程,我应该使用
data.getData().getPath()
从intent获取文件名,我期望的文件名是my_file.pdf,但我得到的是:

/文件/acc=1;doc=28

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

我正在取一个文件

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

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

这从来都不是正确的,尽管它倾向于在旧版本的Android上工作

那怎么办呢

那要看情况了

如果您只希望接受文件,请集成,而不是使用
操作\u获取内容
。(更新2019-04-06:由于Android Q禁止大多数文件系统访问,此解决方案不再实用)

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

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

  • 如果
    Uri
    getScheme()
    返回
    内容
    ,请使用
    DocumentFile.fromsingeluri()
    创建
    文档文件
    ,然后在该
    文档文件
    上调用
    getName()
    ——这应该返回一个用户可以识别的“显示名称”

我正在取一个文件

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

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

这从来都不是正确的,尽管它倾向于在旧版本的Android上工作

那怎么办呢

那要看情况了

如果您只希望接受文件,请集成,而不是使用
操作\u获取内容
。(更新2019-04-06:由于Android Q禁止大多数文件系统访问,此解决方案不再实用)

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

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

  • 如果
    Uri
    getScheme()
    返回
    内容
    ,请使用
    DocumentFile.fromsingeluri()
    创建
    文档文件
    ,然后在该
    文档文件
    上调用
    getName()
    ——这应该返回一个用户可以识别的“显示名称”


要获得真实姓名,避免获得类似“image:4431”的名称,甚至只是一个数字,您可以按照Commonware的建议编写代码。
下面是一个代码示例,该代码选择单个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);
}

希望有帮助。

要获得真实姓名,避免获得类似“image:4431”的名称,甚至只是一个数字,您可以按照Commonware的建议编写代码。
下面是一个代码示例,该代码选择单个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);
}

希望能有所帮助。

回答得非常好,非常完整!非常感谢,
DocumentFile.fromSingleUri()
做了一个技巧:)@commonware,如何使用DocumentFile获取文件路径?@Amila你不知道。您在
DocumentFile
中的
Uri
标识的内容上打开
InputStream
,并以这种方式使用该内容。它可能并不总是有效!检查我的解决方案:真正伟大和完整的答案!非常感谢,
DocumentFile.fromSingleUri()
做了一个技巧:)@commonware,如何使用DocumentFile获取文件路径?@Amila你不知道。您在
DocumentFile
中的
Uri
标识的内容上打开
InputStream
,并以这种方式使用该内容。它可能并不总是有效!检查我的解决方案: