android - Android 选择文件后使用文件时未找到文件

标签 android file

类似于这个问题File not found error after selecting a file in android ,从 SD 选择文件后,我收到文件未找到异常,但是提供的问题中的解决方案对我不起作用,而且还导致另一个文件未找到异常。这是我的代码,它恰好在带有箭头的指示行处抛出 filenotfoundException

private void fileChooser() {
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    intent.setType("*/*");
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    try {
        startActivityForResult(
                Intent.createChooser(intent, "Select a File to Upload"),0);
    } catch (android.content.ActivityNotFoundException ex) {
        // Potentially direct the user to the Market with a Dialog
        Toast.makeText(this, "Please install a File Manager.",
                Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case 0:
            if (resultCode == RESULT_OK) {
                // Get the Uri of the selected file
                Uri uri = data.getData();
                // Get the path
                try {
                    File f=new File(uri.getPath());
                    Bitmap mBitmap=null;
                    screenRuntime.getRewriteMachine().addSendFile(f);

                    ParcelFileDescriptor pfd=ParcelFileDescriptor.open(f,ParcelFileDescriptor.MODE_READ_ONLY); <-------------
                    PdfRenderer renderer=new PdfRenderer(pfd);
                    final int pageCount = renderer.getPageCount();

                    for (int i = 0; i < pageCount; i++) {
                        PdfRenderer.Page page = renderer.openPage(i);

                        // say we render for showing on the screen
                        page.render(mBitmap, null, null, PdfRenderer.Page.RENDER_MODE_FOR_DISPLAY);

                        // do stuff with the bitmap

                        // close the page
                        page.close();
                    }
                    RelativeLayout rl=(RelativeLayout)findViewById(R.id.mainContent);
                    rl.setBackground(new BitmapDrawable(content.getResources(),mBitmap));
                    // close the renderer
                    renderer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                Log.wtf("Sent file","Sent file");
                // Get the file instance
                // File file = new File(path);
                // Initiate the upload
            }
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

谁能告诉我为什么链接中的解决方案对我不起作用?或者我可以做些什么来解决这个问题?或者可能出了什么问题? 这是日志的副本

第110行是ParcelFileDescriptor pfd=ParcelFileDescriptor.open(f,ParcelFileDescriptor.MODE_READ_ONLY);

02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕          java.io.FileNotFoundException: No such file or directory
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.os.Parcel.openFileDescriptor(Native Method)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.os.ParcelFileDescriptor.openInternal(ParcelFileDescriptor.java:253)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.os.ParcelFileDescriptor.open(ParcelFileDescriptor.java:199)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at cmu.edu.screenshare.MainActivity.onActivityResult(MainActivity.java:110)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.app.Activity.dispatchActivityResult(Activity.java:6160)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.app.ActivityThread.deliverResults(ActivityThread.java:3877)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.app.ActivityThread.handleSendResult(ActivityThread.java:3931)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.app.ActivityThread.access$1300(ActivityThread.java:144)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1408)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.os.Looper.loop(Looper.java:155)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5696)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1029)
02-16 14:50:22.969  26284-26284/cmu.edu.screenshare W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:824)

谢谢!

最佳答案

使用下面的代码获取所选文件的路径

 public class SelectedFilePath{




            public static String getPath(final Context context, final Uri uri)
            {

                //check here to KITKAT or new version
                final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;

                // DocumentProvider
                if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) {

                    // ExternalStorageProvider
                    if (isExternalStorageDocument(uri)) {
                        final String docId = DocumentsContract.getDocumentId(uri);
                        final String[] split = docId.split(":");
                        final String type = split[0];

                        if ("primary".equalsIgnoreCase(type)) {
                            return Environment.getExternalStorageDirectory() + "/" + split[1];
                        }
                    }
                    // DownloadsProvider
                    else if (isDownloadsDocument(uri)) {

                        final String id = DocumentsContract.getDocumentId(uri);
                        final Uri contentUri = ContentUris.withAppendedId(
                                Uri.parse("content://<span id="IL_AD1" class="IL_AD">downloads</span>/public_downloads"), Long.valueOf(id));

                        return getDataColumn(context, contentUri, null, null);
                    }
                    // MediaProvider
                    else if (isMediaDocument(uri)) {
                        final String docId = DocumentsContract.getDocumentId(uri);
                        final String[] split = docId.split(":");
                        final String type = split[0];

                        Uri contentUri = null;
                        if ("image".equals(type)) {
                            contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
                        } else if ("video".equals(type)) {
                            contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
                        } else if ("audio".equals(type)) {
                            contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
                        }

                        final String selection = "_id=?";
                        final String[] selectionArgs = new String[] {
                                split[1]
                        };

                        return getDataColumn(context, contentUri, selection, selectionArgs);
                    }
                }
                // MediaStore (and general)
                else if ("content".equalsIgnoreCase(uri.getScheme())) {

                    // Return the remote address
                    if (isGooglePhotosUri(uri))
                        return uri.getLastPathSegment();

                    return getDataColumn(context, uri, null, null);
                }
                // File
                else if ("file".equalsIgnoreCase(uri.getScheme())) {
                    return uri.getPath();
                }

                return null;
            }

            public static String getDataColumn(Context context, Uri uri, String selection,
                                               String[] selectionArgs) {

                Cursor cursor = null;
                final String column = "_data";
                final String[] projection = {
                        column
                };

                try {
                    cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs,
                            null);
                    if (cursor != null && cursor.moveToFirst()) {
                        final int index = cursor.getColumnIndexOrThrow(column);
                        return cursor.getString(index);
                    }
                } finally {
                    if (cursor != null)
                        cursor.close();
                }
                return null;
            }

            public static boolean isExternalStorageDocument(Uri uri) {
                return "com.android.externalstorage.documents".equals(uri.getAuthority());
            }


            public static boolean isDownloadsDocument(Uri uri) {
                return "com.android.providers.downloads.documents".equals(uri.getAuthority());
            }


            public static boolean isMediaDocument(Uri uri) {
                return "com.android.providers.media.documents".equals(uri.getAuthority());
            }


            public static boolean isGooglePhotosUri(Uri uri) {
                return "com.google.android.apps.photos.content".equals(uri.getAuthority());
            }

    }

希望这对你有帮助

关于android - Android 选择文件后使用文件时未找到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429799/

相关文章:

用于访问 Windows 10 上的 Android 文件系统的 python 脚本

python - python多久刷新一次文件?

c++ - 在磁盘上存储列并读取行

django - 在 Django FileField 中重命名文件

android - 是否可以在 android 中录制直播视频?

android - 如何在运行时将按钮控件添加到 android xml View ?

android - 使用 android-maven-plugin 在 Eclipse 中进行简单的非 API Android JUnit 测试?

android - 回收Imagebutton的drawable

c++ - 我应该将类放在 C++ 中的单独文件中吗?

android - 如何以编程方式更改 android 中位图的对比度?