2016-03-30 9 views
0

mit ANDROID vorherige kitkat Ich konnte ein Bild auf SD-Karte ohne Problem speichern, jetzt habe ich stattdessen eine Menge schwierig.Android Lollipop speichern Bild im Hintergrund heruntergeladen auf SD-CARD

Ich kann nicht verstehen, wie ein neues Access Store Framework von Android Lollipop verwenden und ich weiß nicht, ob es für meinen Fall nützlich ist.

Dieser Code unten ist ein Teil von meinem Projekt und es ist perfekt

arbeitet
private Bitmap getBitmap(String url, String image){ 

     String root = Environment.getExternalStorageDirectory().toString(); 
     root = "/mnt/extSdCard/"; 


     Bitmap bitmap = null; 

     File f=fileCache.getFile(url); 

     //from SD cache 
     bitmap = decodeFile(f); 
     if(bitmap!=null) 
      return bitmap; 


     try{ 
      bitmap = BitmapFactory.decodeFile(root + image); 
      if(bitmap!=null){ 
       return bitmap; 
      } 
     }catch (Exception e) { 
      e.printStackTrace(); 
     } 

     //from web 
     if (netInfo != null && netInfo.isConnectedOrConnecting()) { 
      Foto foto = new Foto(); 
      try { 
       try{ 

        foto = new ObjectMapper().readValue(new URL("http://www.xxxxxx.yyyy/project/script.php?id="+url), 
           Foto.class); 

        if(foto!=null){ 
         String[] values = image.split("/"); 
         File dir = new File(root + values[0]); 
         if (!dir.exists()) { 
          dir.mkdir(); 
          String fname = values[1]; 
          File file = new File (dir, fname); 
          bitmap = BitmapFactory.decodeByteArray(foto.getFoto(), 0, foto.getFoto().length); 
          try { 
           FileOutputStream out = new FileOutputStream(file); 
           bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
           out.flush(); 
           out.close(); 

          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         }else{ 
          String fname = values[1]; 
          File file = new File (dir, fname); 
          bitmap = BitmapFactory.decodeByteArray(foto.getFoto(), 0, foto.getFoto().length); 
          try { 
           FileOutputStream out = new FileOutputStream(file); 
           bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out); 
           out.flush(); 
           out.close(); 

          } catch (Exception e) { 
           e.printStackTrace(); 
          } 
         } 

         //bitmap = decodeFile(f); 
         return bitmap; 
        }else{ 
         return bitmap; 
        } 
       }catch(Exception e){ 
        e.printStackTrace(); 
        return null; 
       } 


      } catch (Exception ex){ 
       if (ex instanceof SQLiteConstraintException){ 
        bitmap = BitmapFactory.decodeByteArray(foto.getFoto(), 0, foto.getFoto().length); 
        return bitmap; 
       }else{ 
        ex.printStackTrace(); 
        return null; 
       } 
      } 
     }else{ 
      return bitmap; 
     } 
    } 

Wie ich die ASF neue ändern von Android zu verwenden ??

Wenn ich Environment.getExternalStorageDirectory().getAbsolutePath(); benutze kann ich nicht Pfad von SD-Karte bekommen.

Dank

+0

Was ist der Fehler, dem Sie jetzt gegenüberstehen? Warum weisen Sie den Root-Wert einer fest codierten Zeichenfolge zu? Verwenden Sie dieses Environment.getExternalStorageDirectory(). GetAbsolutePath(); – Stallion

+0

wenn ich 'Environment.getExternalStorageDirectory() verwenden. GetAbsolutePath();' Ich kann SD-Karte Pfad –

Antwort

-1

mit SAF in diesem Beispiel ich in der Lage war, auf dem SD-Karte zu schreiben:

public class MainActivity extends AppCompatActivity { 

Uri sdCardUri; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

     Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
     startActivityForResult(intent, 1); 
} 

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

      if (resultCode == Activity.RESULT_OK) { 
       sdCardUri = data.getData(); 

       getContentResolver().takePersistableUriPermission(sdCardUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
      } 
      createFile(); 

      break; 
    } 
} 

private void createFile() { 
    DocumentFile sdCard=DocumentFile.fromTreeUri(this,sdCardUri); 
    DocumentFile createFile=sdCard.findFile("teste.txt"); 
    if (createFile==null) 
     createFile=sdCard.createFile("text","teste.txt"); 
    OutputStream outStream = null; 
    try { 
     outStream = getContentResolver().openOutputStream(createFile.getUri()); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    try { 
     String teste="Isto é um teste"; 
     outStream.write(teste.getBytes()); 
     outStream.flush(); 
     outStream.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

}

i de SAF verwenden, um die SD-Karte wählen vollständige Berechtigungen zu gewinnen, wie erklärt in https://metactrl.com/docs/sdcard-on-lollipop/

+0

nicht erhalten Dies ist keine gültige Lösung ... In andorid Studio Emulator geben Sie mir '/ sdcard/Download' aber dies Verzeichnis ist beschreibbar –

+0

Ich weiß noch nicht, wie man die Auswahl der sdcard des Benutzers vermeidet und daran arbeitet –

Verwandte Themen