Java 如何在Android中从URI/URI打开文件

Java 如何在Android中从URI/URI打开文件,java,android,Java,Android,我正试图从模拟器的内部存储器中打开一个文件(试图将其放入SD卡中,但将其放入内部存储器?)。我让用户选择一个文件,然后通过intent将该文件的Uri(注意大小写)传递给文本编辑活动。在这次活动中,我尝试了一些东西。我当前的代码是这样的(请原谅我的疯狂,我已经尝试了很多东西): 我尝试了很多事情,但都没有成功。我要么没有找到文件(因为它没有在文件前面加任何前缀,只是尝试加载“document/primary%3Aindex.html”),要么出现其他异常,当前: 06-06 05:43:18.8

我正试图从模拟器的内部存储器中打开一个文件(试图将其放入SD卡中,但将其放入内部存储器?)。我让用户选择一个文件,然后通过intent将该文件的Uri(注意大小写)传递给文本编辑活动。在这次活动中,我尝试了一些东西。我当前的代码是这样的(请原谅我的疯狂,我已经尝试了很多东西):

我尝试了很多事情,但都没有成功。我要么没有找到文件(因为它没有在文件前面加任何前缀,只是尝试加载“document/primary%3Aindex.html”),要么出现其他异常,当前:

06-06 05:43:18.826 10794-10794/net.a40two.pext E/AndroidRuntime: FATAL EXCEPTION: main
                                                             Process: net.a40two.pext, PID: 10794
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{net.a40two.pext/net.a40two.pext.ui.EditorActivity}: java.lang.IllegalArgumentException: Found authority in URI: file://content://com.android.externalstorage.documents/document/primary%3Aindex.html
                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                 at android.os.Looper.loop(Looper.java:148)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                              Caused by: java.lang.IllegalArgumentException: Found authority in URI: file://content://com.android.externalstorage.documents/document/primary%3Aindex.html
                                                                 at java.io.File.checkURI(File.java:230)
                                                                 at java.io.File.<init>(File.java:175)
                                                                 at net.a40two.pext.ui.EditorActivity.onCreate(EditorActivity.java:67)
                                                                 at android.app.Activity.performCreate(Activity.java:6237)
                                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                 at android.os.Looper.loop(Looper.java:148) 
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

这里有一个无效的,
file://content://
-您应该有一个或另一个,而不是两个。(我不知道在这个上下文中是哪一个,但例外是一个格式错误的URI)@MattClark正如我上面所说的,无论是否使用文件前缀://都会发生这种情况<代码>由以下原因引起:java.lang.IllegalArgumentException:URI中的预期文件方案:content://com.android.externalstorage.documents/document/primary%3Aindex.html这个URI看起来仍然无效。您试图访问的文件的物理位置是什么?关于外部存储?还是将其编译到源目录中,并与APK一起分发?无论哪种方式,您都无法正确访问文件。@MattClark如第一句所述,它位于仿真器的内部存储器中。我通过安卓设备监视器上传了它。它不包括在APK中,也不以任何方式与我的应用程序关联,除了在同一个模拟器中。我传递到这个活动中并通过
uriuri=Parcels.unwrap(intent.getParcelableExtra(“URI”))检索的URI
是Android系统返回的代码。我知道我没有正确地访问它。显然,我不知道这样做的正确方法。
06-06 05:43:18.826 10794-10794/net.a40two.pext E/AndroidRuntime: FATAL EXCEPTION: main
                                                             Process: net.a40two.pext, PID: 10794
                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{net.a40two.pext/net.a40two.pext.ui.EditorActivity}: java.lang.IllegalArgumentException: Found authority in URI: file://content://com.android.externalstorage.documents/document/primary%3Aindex.html
                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                                 at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                 at android.os.Looper.loop(Looper.java:148)
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                 at java.lang.reflect.Method.invoke(Native Method)
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                              Caused by: java.lang.IllegalArgumentException: Found authority in URI: file://content://com.android.externalstorage.documents/document/primary%3Aindex.html
                                                                 at java.io.File.checkURI(File.java:230)
                                                                 at java.io.File.<init>(File.java:175)
                                                                 at net.a40two.pext.ui.EditorActivity.onCreate(EditorActivity.java:67)
                                                                 at android.app.Activity.performCreate(Activity.java:6237)
                                                                 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                                                                 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                                                                 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                                                                 at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                                 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                                 at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                 at android.os.Looper.loop(Looper.java:148) 
                                                                 at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                                 at java.lang.reflect.Method.invoke(Native Method) 
                                                                 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                                 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    public void onActivityResult(int requestCode, int resultCode,
                             Intent resultData) {
    // The ACTION_OPEN_DOCUMENT intent was sent with the request code
    // READ_REQUEST_CODE. If the request code seen here doesn't match, it's the
    // response to some other intent, and the code below shouldn't run at all.
    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {
        // The document selected by the user won't be returned in the intent.
        // Instead, a URI to that document will be contained in the return intent
        // provided to this method as a parameter.
        // Pull that URI using resultData.getData().
        Uri uri = null;
        if (resultData != null) {
            uri = resultData.getData();
            Log.i("onActivityResult", "Uri: " + uri.toString());

            Intent intent = new Intent(MainActivity.this, EditorActivity.class);
            intent.putExtra("uri", Parcels.wrap(uri));
            startActivity(intent);
            finish();

        }
    }
}