2017-08-01 4 views
0

Je développe une application dans laquelle j'ouvre l'explorateur de fichiers et sélectionne n'importe quel fichier de mon choix et récupère son contenu. Le chemin par défaut qui s'ouvre est/storage/sdcard0. Je suis capable de lire le contenu de n'importe quel fichier qui réside directement dans ce chemin. Cependant, pour tout fichier contenu dans un dossier dans/storage/sdcard0 /. est inaccessible. Le programme donne un fichier introuvable erreur. De plus, je ne comprends pas le chemin que ces fichiers ont, comme par exemple, si un fichier se trouve dans le chemin:Comment lire des fichiers sur un chemin spécifique dans Android?

/storage/sdcard0/DCIM/100ANDRO/DSC_0001.jpg

, la logcat montre le chemin d'être:

contenu: /media/external/images/media/84290/DSC_0001.jpg

Comment un Cessez ce fichier dans mon code Java?

est Ci-dessous l'extrait de code:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    Log.d(TAG, "requestCode received: "+requestCode+" result code: "+resultCode); 

    if (requestCode == 1 && resultCode == RESULT_OK) { 

     Bitmap thumbnail = (Bitmap) data.getExtras().get("data"); 
     String folderPath = "Anant"; 
     String filePath = "image.jpg"; 

     String imagePath = saveToInternalStorage(thumbnail, folderPath, 
       sImageName); 

     Log.i(TAG, "DeviceAPIS:actual path :: " 
       + imagePath.trim().toString()); 
     sendCameraData(imagePath.toString().trim(), 
       ptrAppContainerForCamera); 
    } 

    else if (requestCode == REQUEST_PATH){ 
     if (resultCode == RESULT_OK) { 
       // Get the Uri of the selected file 
      Uri uri = data.getData(); 
      Log.d(TAG, "data.getData() result line 742: " + uri); 
      String uriString = uri.toString(); 
      File myFile = new File(uriString); 
      String path = myFile.getAbsolutePath(); 
      String base64 ="Error"; 
      byte[] bytesRead = base64.getBytes(); 
      String displayName = null; 
      String fileName = null; 

      if (uriString.startsWith("content://")) {    
       Cursor cursor = null; 
       try {       
        cursor = mContext.getContentResolver().query(uri, null, null, null, null);       
        if (cursor != null && cursor.moveToFirst()) {        
         displayName = cursor.getString(cursor.getColumnIndex(OpenableColumns.DISPLAY_NAME)); 
         displayName = path + "/" + displayName; 
         Log.d(TAG, "BEFORE REPLACE: "+displayName); 
         int index = displayName.indexOf(':'); 
         fileName = displayName.substring(index + 1, displayName.length()); 
         Log.d(TAG,"displayName line 762 " + Part); 
        } 
       } finally { 
        cursor.close(); 
       } 
      } else if (uriString.startsWith("file://")) { 
       Log.d(TAG, "FILE BLOCK LINE 768");   
       displayName = myFile.getName(); 
       Log.d(TAG,"displayName 11" + displayName); 
      } 


      try{ 
       File sdcard = Environment.getExternalStorageDirectory(); 
       File readFile = new File(sdcard, fileName); 
     //  File readFile = new File(uri); 

       int length = (int)readFile.length(); 

       byte[] bytes = new byte[length]; 

       FileInputStream in = new FileInputStream(readFile); 
       try{ 
        in.read(bytes); 
       }finally { 
        in.close(); 
       } 

       String contents = new String(bytes); 
       Log.d(TAG,"contents read :: \\n" + contents); 

       //convert to Base64 
       bytesRead = contents.getBytes("UTF-8"); 
       base64 = Base64.encodeToString(bytesRead,Base64.DEFAULT); 

      }catch (Exception e){ 
       Log.d(TAG, "THROWING EXCEPTION"); 
       Log.e(TAG,e.getMessage(),e); 
      } 
     } 

L'exception levée est java.io.FileNotFoundException. Toute aide est grandement appréciée.

Répondre

0

Vous pouvez essayer comme ci-dessous:

String path = null; 
    Uri originalUri = data.getData(); 
    try { 
     String[] proj = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = this.managedQuery(originalUri, proj, null, null, null); 
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     path = cursor.getString(column_index); 
    } catch (Exception e) { 

    } finally { 
     cursor.close(); 
    } 

Et si le chemin est nul, vous pouvez obtenir bitmap d'abord, puis le copier sur votre chemin d'accès local.

ContentResolver resolver = this.getContentResolver(); 
    Bitmap photo = MediaStore.Images.Media.getBitmap(resolver, originalUri); 
    .... // copy photo to your local path 
+0

Wow! Cela fonctionne vraiment! Merci beaucoup! :) :) – Naruto

0

vous pouvez essayer,

1. make sure you have added permission in you manifest file 
2. Settings -> Apps -> Your App -> Permissions -> Storage = true/enabled 

j'avais fait face à une même question de FileNotFound et j'ai pu le résoudre par 2 ci-dessus.

+0

Salut @JTeam, les autorisations n'étaient pas le problème ici je suppose. C'était le code lui-même. – Naruto