2015-07-15 63 views
5

Devo inviare byte[] data da Activity1 a Activity2, per scrivere data("FileOutputStream.write(data)") in un file jpg. Il mio file .jpg finale potrebbe superare 1mb.Come inviare array di byte di grandi dimensioni tra attività in Android?

Activity1:

public void onPictureTaken(byte[] data, Camera camera) { 

    Log.w("ImageSizeMyApp", String.valueOf(data.length)); 

    mCamera.startPreview(); 
    Intent shareWindow = new Intent(Activity1.this, Activity2.class); 
    shareWindow.putExtra("photo",data); 
    startActivity(shareWindow); 
    closeCamera(); 

    Log.w("CameraActivity:", "onPictureTaken"); 

} 

In Activity2:

Bundle extras = getIntent().getExtras(); 
data = extras.getByteArray("photo"); 

Io uso Log.w("ImageSizeMyApp", String.valueOf(data.length)); per ottenere questo:

  1. ImageSizeMyApp: 446.367 (questa dimensione invia al prossimo esercizio, e tutto è buono)

  2. ImageSizeMyApp: 577.368 (questo formato si chiude la mia macchina fotografica, e non invia all'attività successiva)

Così 500kb è la dimensione limite per Intent. C'è qualche altro metodo stabile per inviare il mio byte[] superiore a 500kb tra le attività?

Qualsiasi riferimento o consiglio è benvenuto. Grazie in anticipo!

Aggiornamento: Potrei fare un'altra classe per memorizzare quell'array di byte []? O è meglio usare una variabile statica?

+0

dove si trova la, jpg memorizzate? puoi utilizzare il percorso e passare tra le attività – Raghunandan

+0

consulta questo http://stackoverflow.com/questions/11519691/passing-image-from-one-activity-another-activity – sasikumar

+0

@Raghunandan il .jpg viene creato e memorizzato sul dispositivo solo nella seconda attività. Voglio creare un file jpg e memorizzarlo localmente quando viene premuto un pulsante. –

risposta

2

Ho avuto lo stesso problema. In breve: sottoclasse lo Application (o crea un helper singleton), usalo (<application android:name=".App" .../> in manifest.xml) e memorizza lì i dati dell'immagine.

App.java frammento:

public final class App extends Application { 
    private static App sInstance; 
    private byte[] mCapturedPhotoData; 

    // Getters & Setters 
    public byte[] getCapturedPhotoData() { 
     return mCapturedPhotoData; 
    } 

    public void setCapturedPhotoData(byte[] capturedPhotoData) { 
     mCapturedPhotoData = capturedPhotoData; 
    } 

    // Singleton code 
    public static App getInstance() { return sInstance; } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     sInstance = this; 
    } 
} 

attività della fotocamera salva i dati:

private Camera.PictureCallback mJpegCaptureCallback = new Camera.PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 
     // We cannot pass the large buffer via intent's data. Use App instance. 
     App.getInstance().setCapturedPhotoData(data); 
     setResult(RESULT_OK, new Intent()); 
     finish(); 
    } 
}; 

Parent attività legge i dati:

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

    if (requestCode == RequestCode.CAPTURE && resultCode == RESULT_OK) { 
     // Read the jpeg data 
     byte[] jpegData = App.getInstance().getCapturedPhotoData(); 
     App.log("" + jpegData.length); 

     // Do stuff 

     // Don't forget to release it 
     App.getInstance().setCapturedPhotoData(null); 
    } 
} 
0

Questi i passaggi:

1) Crea una tabella in SQLite con byte e id colonne 2) Salvare questo byte e la sua identificazione (daresti) da Attività 1 3) Vai Activity 2 (non dimenticare per inviare l'id del parametro) 4) Nell'attività 2 ottenere questo parametro dall'intenzione e dal database di query utilizzando id per ottenere il byte.

Spero che questo aiuti.

3
  1. Creare un file temporaneo.
  2. Passare il percorso del file all'Altra attività.
  3. Ottieni il percorso e carica l'immagine.

Attività 1:

//creates the temporary file and gets the path 
String filePath= tempFileImage(context,yourBitmap,"name"); 



Intent intent = new Intent(context, Activity2.class); 

//passes the file path string with the intent 
intent.putExtra("path", filePath); 


startActivity(intent); 

Utilizzare questo metodo per creare il file:

//creates a temporary file and return the absolute file path 
public static String tempFileImage(Context context, Bitmap bitmap, String name) { 

    File outputDir = context.getCacheDir(); 
    File imageFile = new File(outputDir, name + ".jpg"); 

    OutputStream os; 
    try { 
     os = new FileOutputStream(imageFile); 
     bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os); 
     os.flush(); 
     os.close(); 
    } catch (Exception e) { 
     Log.e(context.getClass().getSimpleName(), "Error writing file", e); 
    } 

    return imageFile.getAbsolutePath(); 
} 

Attività 2:

//gets the file path 
String filePath=getIntent().getStringExtra("path"); 

//loads the file 
File file = new File(filePath); 

caricare Infine l'immagine:

Picasso.with(context).load(file).fit().centerCrop().into(imageView); 

Oppure:

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 
imageView.setImageBitmap(bitmap);