Android 使用ContentResolver的Uri文件路径 目标:使用意图选择文件 目的:文件上传

Android 使用ContentResolver的Uri文件路径 目标:使用意图选择文件 目的:文件上传,android,android-intent,android-contentresolver,Android,Android Intent,Android Contentresolver,问题:如何从Uri获取文件路径。请注意,没有 特定的文件类型。用户可以从设备上可用的文件选择器列表中选择任何文件 到目前为止,我已经编码了什么 从Intent返回的典型uri是 现在我有了文件名,MimeType,文件大小,输入流。这符合我的目的,但是 如何从内容提供商处获取文件路径,而不是使用 输入流 您已经在使用正确的解决方案。通过获取文件路径,可以尝试直接读取文件,但由于沙箱的原因,在大多数情况下,它都会失败。例如,如果文件位于另一个应用程序的应用程序目录中。通过使用内容提供商,其他应用程

问题:如何从Uri获取文件路径。请注意,没有 特定的文件类型。用户可以从设备上可用的文件选择器列表中选择任何文件

到目前为止,我已经编码了什么 从Intent返回的典型uri是

现在我有了文件名MimeType文件大小输入流。这符合我的目的,但是

如何从内容提供商处获取文件路径,而不是使用 输入流


您已经在使用正确的解决方案。通过获取文件路径,可以尝试直接读取文件,但由于沙箱的原因,在大多数情况下,它都会失败。例如,如果文件位于另一个应用程序的应用程序目录中。通过使用内容提供商,其他应用程序可以授予您对某些URI的读取权限,这些URI允许您读取文件


此外,在编写内容提供程序时,没有人强制您导出文件路径。在内部,您必须处理它们,但在外部,只有URI才重要。因此,作为提供商的消费者,您可以也不应该对文件路径做出任何假设。

您已经在使用正确的解决方案。通过获取文件路径,可以尝试直接读取文件,但由于沙箱的原因,在大多数情况下,它都会失败。例如,如果文件位于另一个应用程序的应用程序目录中。通过使用内容提供商,其他应用程序可以授予您对某些URI的读取权限,这些URI允许您读取文件


此外,在编写内容提供程序时,没有人强制您导出文件路径。在内部,您必须处理它们,但在外部,只有URI才重要。因此,作为提供者的使用者,您可以也不应该对文件路径做出任何假设。

您的
Uri=intent.getData()是什么?对问题进行了编辑@pskinkso只有那些具有
file://
scheme的文件必须是物理文件,其他
Uri
s可以是纯虚拟的:您必须使用
InputStream
什么是您的
Uri=intent.getData()?对问题进行了编辑@pskinkso只有那些具有
file://
scheme的文件必须是物理文件,其他
Uri
s可以是纯虚拟的:您必须使用
InputStream
读取它们,因此,如果我想读取文件。我必须使用InputStream。无法直接访问文件并在此处保存我的一些应用程序资源?如果需要,可以尝试。正如您所看到的,您提供的一些URI以“内容”开头,而其他URI以“文件”开头。后者可用于创建具有“new File(uri.getPath)”的文件。但是是的。如果您想从其他应用程序上载文件,请将其复制到应用程序拥有的某个目录,或直接从提供商将文件流式传输到服务器。好的。谢谢!我还试着在developer.android.com上搜索一些指南,但找不到任何关于如何读取文件的有用信息。我必须使用InputStream。无法直接访问文件并在此处保存我的一些应用程序资源?如果需要,可以尝试。正如您所看到的,您提供的一些URI以“内容”开头,而其他URI以“文件”开头。后者可用于创建具有“new File(uri.getPath)”的文件。但是是的。如果您想从其他应用程序上载文件,请将其复制到应用程序拥有的某个目录,或直接从提供商将文件流式传输到服务器。好的。谢谢!我还尝试在developer.android.com上搜索一些指南,但找不到任何关于如何读取文件的有用信息。
{
//File Pick Intent
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("*/*");
        try {
            (context).startActivityForResult(
                    Intent.createChooser(intent, "Select a File to Upload"),
                    PICK_FILE);
        }
        catch (android.content.ActivityNotFoundException ex) {
            Toast.makeText(context, "Please install a File Manager.", Toast.LENGTH_SHORT).show();
        }
}

// On Activity Result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {

        if (requestCode == PICK_FILE && resultCode == Activity.RESULT_OK) {

            Uri uri = intent.getData();

            String mimeType = getContentResolver().getType(uri);
            Cursor returnCursor = getContentResolver().query(uri,null, null, null, null);

            int nameIndex = returnCursor.getColumnIndex(OpenableColumns.DISPLAY_NAME);
            int sizeIndex = returnCursor.getColumnIndex(OpenableColumns.SIZE);

            System.out.println("mime: "+ mimeType);
            System.out.println("name: " + returnCursor.getString(nameIndex));
            System.out.println("size: " + returnCursor.getString(sizeIndex));

            // File Input Stream gets me file data
            InputStream inputStream = getContentResolver().openInputStream(uri);
            // Can create a file using this stream but I am looking for some better dolution that gives me file path instead

}
1. { dat=content://com.google.android.apps.docs.storage/document/acc=1;doc=107 flg=0x1 }
2. { dat=file:///Removable/MicroSD/docs/doccuments.rar flg=0x3 }
3. { dat=content://media/external/audio/media/1110 }
4. { dat=content://com.android.externalstorage.documents/document/primary:.profig.os flg=0x1 }