2016-02-16 3 views
1

похоже на этот вопрос File not found error after selecting a file in android, я получаю файл не найденным исключением после того, как я выбираю файл с SD, однако решение в предоставленном вопросе не помогло мне, но также привело к другой файл не найден исключение. Вот мой код, и он бросает FileNotFoundException точно по указанной линии со стрелкойФайл не найден при использовании файла после его выбора Android

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) 

Спасибо!

+0

@saeed файл выбран не образ, я использую pdfRenderer API из API 21, чтобы отобразить страницу из PDF-файла в растровом изображении. На самом деле это не проблема, и это не актуально, так как мой код даже не доходит до него. Он падает по указанной линии. – gedo

+0

@saeed ParcelFileDescriptor pfd = ParcelFileDescriptor.open (f, ParcelFileDescriptor.MODE_READ_ONLY); – gedo

+0

можете ли вы разместить свой логарифм? – saeed

ответ

4

Используйте приведенные ниже кода, чтобы получить путь от выбранного файла

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

    } 

Надеется, что это поможет вам

+0

Позвольте мне узнать ваш результат – saeed

+0

Это сработало! Прочитайте это сейчас! Спасибо огромное! – gedo

+0

Iam рад помочь вам – saeed

0

URI, который вы получаете здесь не может быть файлом. Это может быть URI контента.

Этот тип URI должен быть считан от getContentResolver().openInputStream(uri).

Попробуйте этот код ниже:

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
       super.onActivityResult(requestCode, resultCode, data); 
       addedFiles = new ArrayList<Attachment>(); 
       if (resultCode == RESULT_OK) { 
        switch (requestCode) { 
         case ADD_FILE_REQ_CODE: 
          if (data.getData() != null) { 
           Uri uri = data.getData(); 
           File newFile = new File(uri.getPath()); 
           try { 

            InputStream ips = getContentResolver().openInputStream(uri); 
            byte[] bytes = new byte[ips.available()]; 
            ips.read(bytes, 0, bytes.length); 
            <<Your logic continues>> 
} 
}