2014-06-06 18 views
6

Stavo guardando lo Parse Android docs e ho visto che per salvare foto e video, è necessario inizializzare uno new ParseFile con un nome e un byte [] di dati e salvarlo.Salvataggio e retrocessione di foto e video in Parse (Android)

Qual è il modo più semplice per convertire un'immagine Uri e video Uri in un array di byte?

qui sono i miei tentate soluzioni:

mPhoto = new ParseFile("img", convertImageToBytes(Uri.parse(mPhotoUri))); 
mVideo = new ParseFile ("vid", convertVideoToBytes(Uri.parse(mVideoUri))); 

private byte[] convertImageToBytes(Uri uri){ 
    byte[] data = null; 
    try { 
     ContentResolver cr = getBaseContext().getContentResolver(); 
     InputStream inputStream = cr.openInputStream(uri); 
     Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
     data = baos.toByteArray(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 
    return data; 
} 

private byte[] convertVideoToBytes(Uri uri){ 
    byte[] videoBytes = null; 
    try { 
     ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
     FileInputStream fis = new FileInputStream(new File(getRealPathFromURI(this, uri))); 

     byte[] buf = new byte[1024]; 
     int n; 
     while (-1 != (n = fis.read(buf))) 
      baos.write(buf, 0, n); 

     videoBytes = baos.toByteArray(); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return videoBytes; 
} 

private String getRealPathFromURI(Context context, Uri contentUri) { 
    Cursor cursor = null; 
    try { 
     String[] proj = { MediaStore.Video.Media.DATA }; 
     cursor = context.getContentResolver().query(contentUri, proj, null, 
       null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Video.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
}  

I convertImageToBytes e convertVideoToBytes metodi funzionano per ora, ma mi chiedo solo se sto facendo fare questo in modo corretto.

+0

C'è un motivo per cui a decodificare l'immagine e quindi comprimere di nuovo? – harism

+0

@harism Non ne sono proprio sicuro - l'ho trovato su una risposta Stack Overflow credo. Ho davvero poca esperienza con questo, ma potrebbe essere perché devi convertire il percorso dell'immagine in una Bitmap. – lschlessinger

+0

Chiedendosi solo perché potrebbe benissimo essere il caso, non c'è bisogno di metodi separati per la lettura di array di byte di immagini e video. – harism

risposta

7

Da Uri per ottenere byte [] io fare le seguenti cose,

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
FileInputStream fis = new FileInputStream(new File(yourUri)); 

byte[] buf = new byte[1024]; 
int n; 
while (-1 != (n = fis.read(buf))) 
    baos.write(buf, 0, n); 

byte[] videoBytes = baos.toByteArray(); //this is the video in bytes. 
+0

c'è qualche possibilità di ridurre la dimensione del file video durante la conversione di file video in array di byte? per favore rispondi :( –