选择它的Andr​​oid使用后的文件时,文件未找到 [英] File not found when using file after selecting it Android

查看:171
本文介绍了选择它的Andr​​oid使用后的文件时,文件未找到的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

与此类似问题<一href=\"http://stackoverflow.com/questions/30075095/file-not-found-error-after-selecting-a-file-in-android\">File未找到错误在android系统选择文件后,我收到了文件,未发现异常后,我从SD选择一个文件,但是在提供的问题解决,我没有工作,也造成了另一个文件未发现异常。这里是我的code,并在指定的线路正好抛出一个FileNotFoundException异常带箭头

similar to this question File not found error after selecting a file in android , I get a file not found exception after I select a file from SD however the solution in the question provided did not work for me, but also resulted in another file not found exception. Here is my code, and it throws a filenotfoundexception exactly at the indicated line with an arrow

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

谁能告诉我,为什么链接中的解决方案并没有为我工作?还是什么我可以做些什么来解决这个问题?或者什么可能会错误?
这里是日志的副本

Can anyone tell me why the solution in the link does not work for me? or what I could do to fix this? or what could possibly be going wrong? Here is a copy of the log

行110 ParcelFileDescriptor PFD = ParcelFileDescriptor.open(F,ParcelFileDescriptor.MODE_READ_ONLY);

line 110 is 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)

谢谢!

推荐答案

使用下面code摆脱选定的文件路径

Use Below code to get path from selected file

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

    }

希望这将帮助你。

Hope this will helps you

这篇关于选择它的Andr​​oid使用后的文件时,文件未找到的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆