2015-07-15 11 views
5

Muszę wysłać byte[] data z Activity1 do Activity2, aby napisać data("FileOutputStream.write(data)") w pliku jpg. Mój ostateczny plik .jpg może przekroczyć 1 MB.Jak wysłać tablice z dużą liczbą bajtów między działaniami w systemie 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"); 

} 

W Activity2:

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

używam Log.w("ImageSizeMyApp", String.valueOf(data.length)); uzyskać to:

  1. ImageSizeMyApp: 446367 (ta wielkość wysyła do następnej aktywności i wszystko jest dobrze)

  2. ImageSizeMyApp: 577368 (ta wielkość zamyka mój aparat i nie wysyła do następnej aktywności)

Więc 500kb jest wymiar granica intencyjny. Czy istnieje inna stabilna metoda wysyłania mojego byte[] większego niż 500 kb pomiędzy działaniami?

Wszelkie odniesienia lub porady są mile widziane. Z góry dziękuję!

Aktualizacja: Czy mogę utworzyć inną klasę do przechowywania tej tablicy bajtów []? A może lepiej użyć zmiennej statycznej?

+0

gdzie jest, jpg przechowywane? możesz użyć ścieżki i przekazać, że pomiędzy działaniami – Raghunandan

+0

odsyłaj ten http://stackoverflow.com/questions/11519691/passing-image-from-one-activity-another-activity – sasikumar

+0

@Raghunandan .jpg jest tworzony i przechowywany na urządzeniu tylko w drugim działaniu. Chcę zrobić plik jpg i przechowywać go lokalnie po naciśnięciu przycisku. –

Odpowiedz

2

Miałem ten sam problem. W skrócie: podklasa Application (lub utwórz pomocnika singleton), użyj jej (<application android:name=".App" .../> w manifest.xml) i zapisz tam dane obrazu.

App.java urywek:

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

Camera aktywny zapisuje dane:

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 Aktywny odczytuje dane:

@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

Następujące kroki:

1) Tworzenie tabeli w SQLite z bajtowych i identyfikator kolumn 2) Zapisz ten bajt i jego id (dasz) z działalności 1 3) Przejdź do Działania 2 (nie zapomnieć wysłać parametr id) 4) W Activity 2 uzyskać ten parametr z intencji i bazy danych zapytań za pomocą id, aby uzyskać bajt.

Mam nadzieję, że to pomoże.

3
  1. Utwórz tymczasowy plik.
  2. Przekaż ścieżkę pliku do innej czynności.
  3. Uzyskaj ścieżkę i załaduj obraz.

aktywny 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); 

pomocą tej metody można utworzyć plik

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

aktywny 2:

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

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

koniec ładowania obraz:

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

Lub:

Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath()); 
imageView.setImageBitmap(bitmap); 
Powiązane problemy