2012-11-27 44 views
6

Trong ứng dụng của tôi, tôi đang hiển thị hình ảnh no.of từ thư viện từ đó ngay sau khi tôi chọn một hình ảnh, hình ảnh sẽ được gửi đến hoạt động mới nơi hình ảnh được chọn sẽ được đặt như background.However, tôi có thể lấy hình ảnh từ thư viện nhưng ngay sau khi tôi chọn một ứng dụng bị treo.Thanks trướcchuyển một hình ảnh bitmap từ một hoạt động này sang một hoạt động khác

Hoạt động-1 (Hình ảnh được hiển thị trong thư viện và hình ảnh được chọn sẽ được gửi đến mới hoạt động)

public class Gallery extends Activity { 

private static int RESULT_LOAD_IMAGE = 1; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.gallery); 

     Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture); 


     buttonLoadImage.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View arg0) { 

       Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

       startActivityForResult(i, RESULT_LOAD_IMAGE); 
      } 
     }); 
    } 



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

     if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) { 






      Uri contentUri = data.getData();   
      String[] proj = { MediaStore.Images.Media.DATA };   
      Cursor cursor = managedQuery(contentUri, proj, null, null, null);   
      int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);   
      cursor.moveToFirst();   
      String tmppath = cursor.getString(column_index);   
      Bitmap croppedImage = BitmapFactory.decodeFile(tmppath); 


      // Bitmap croppedImage = BitmapFactory.decodeFile(croppedImage); 
      Intent intent = new Intent(Gallery.this,GesturesActivity.class); 
      intent.putExtra("bmp",croppedImage); 
      startActivity(intent); 

      Log.v("sending image","sending image"); 


     } 


    } 
} 

hoạt động-1 (XML)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/background" 
    > 
    <ImageView 
      android:id="@+id/imgView" 
      android:layout_width="fill_parent" 
      android:layout_weight="1" android:layout_height="wrap_content"></ImageView> 
    <Button 
      android:layout_height="wrap_content" 
      android:text="Load Picture" 
      android:layout_width="wrap_content" 
      android:id="@+id/buttonLoadPicture" 
      android:layout_weight="0" 
      android:layout_gravity="center"></Button> 
</LinearLayout> 

Hoạt động-2 (Các hoạt động nơi các hình ảnh được chọn sẽ được thiết lập như hình nền của màn hình)

public class GesturesActivity extends Activity { 


     private final int MENU_CAMERA = Menu.FIRST; 


     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 


      Bitmap bmp = (Bitmap)this.getIntent().getParcelableExtra("bmp"); 
      BitmapDrawable background = new BitmapDrawable(bmp); 
      getWindow().setBackgroundDrawable(background); //background image of the screen 



      Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.advert); 
      View view = new SandboxView(this, bitmap); 

      setContentView(view); 
     } 



     public boolean onPrepareOptionsMenu(Menu menu) { 
      menu.clear(); 

       menu.add(0, 11, 0, "Take Snapshot"); 

        return super.onPrepareOptionsMenu(menu); 
     } 


     public boolean onOptionsItemSelected(MenuItem item) { 

      return super.onOptionsItemSelected(item); 
     } 



    } 
+0

Kiểm tra [this] (http://stackoverflow.com/a/6647023/1265724) –

+0

bạn có thể đăng logcat – Prachi

Trả lời

18

Có 3 giải pháp để giải quyết vấn đề này.

1) Chuyển đổi hình ảnh đầu tiên thành mảng Byte và sau đó chuyển sang Intent và trong hoạt động tiếp theo nhận mảng byte từ gói và chuyển thành hình ảnh (bitmap) và đặt thành ImageView.

Chuyển đổi Bitmap để Byte Array: -

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

đèo byte mảng vào ý: -

Intent intent = new Intent(this, NextActivity.class); 
intent.putExtra("picture", byteArray); 
startActivity(intent); 

Nhận Byte mảng từ Bundle và Chuyển đổi thành Bitmap hình ảnh: -

Bundle extras = getIntent().getExtras(); 
byte[] byteArray = extras.getByteArray("picture"); 

Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length); 
ImageView image = (ImageView) findViewById(R.id.imageView1); 

image.setImageBitmap(bmp); 

2) Trước tiên Lưu hình ảnh vào SDCard và trong hoạt động tiếp theo, đặt hình ảnh này vào ImageView.

3) Chuyển bitmap vào Intent và nhận bitmap trong hoạt động tiếp theo từ gói, nhưng vấn đề là nếu kích thước ảnh/bitmap của bạn lớn vào thời điểm đó hình ảnh không tải trong hoạt động tiếp theo.

+0

: theo giải pháp thứ nhất của bạn, nếu tôi muốn chuyển đổi một lần xem hình ảnh thành bitmap, làm cách nào tôi có thể làm việc đó đi? –

1

Tôi nghĩ bạn có thể làm bằng cách xác định Bitmap của bạn như tĩnh và bằng cách gọi classname.bitmap bạn có thể nhận được bitmap..and thiết lập như là nền tảng về Hoạt động tiếp theo

6

Vì bạn đang truy xuất hình ảnh từ Gallery , tại sao không chuyển id cho hoạt động tiếp theo và truy xuất hình ảnh trong hoạt động đó thay vì chuyển hình ảnh? Điều này sẽ giúp bạn về bộ nhớ và hiệu suất.

+3

+1, cách thuận tiện nhất. lưu trữ ID hành lý mà người dùng chọn và chuyển ID đó cho hoạt động tiếp theo. –

0

IGP tóm tắt nó một cách rõ ràng, nhưng theo ý kiến ​​của tôi, cách hiệu quả nhất để làm điều đó là chuyển URI của hình ảnh đến hoạt động tiếp theo, thay vì bản thân Bitmap. Tôi thực sự không chắc chắn nếu nó có thể vượt qua toàn bộ Bitmap (hoặc, chuyển đổi, ByteArrays) của dữ liệu từ một hoạt động khác bằng cách sử dụng Intents - Tôi tin rằng có một giới hạn về bao nhiêu dữ liệu một bó có thể chứa.

Thay vì chuyển tham chiếu bạn đang sử dụng để hiển thị hình ảnh trong hoạt động đầu tiên. Tôi cho rằng bạn đang sử dụng một số loại tải lười biếng? Nếu không, tôi khuyên bạn nên làm. Bằng cách này bạn có thể chỉ cần truy vấn lại cho Bitmap thông qua URI.

Tuy nhiên, tôi có thể nhận được những hình ảnh từ bộ sưu tập nhưng ngay sau khi tôi chọn một ứng dụng bị treo

Tôi vẫn còn bối rối như thế nào các loại của các vấn đề đạt được SO. Kiểm tra các bản ghi, có thể bạn có thể tự mình tìm ra nó.

0

Sử dụng tính năng này, bạn có thể chuyển bitmap sang hoạt động khác.

Nếu bạn đang sử dụng drawable so với chuyển đổi mà drawable để bitmap đầu tiên.

Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); 

Để chuyển bitmap đó đến hoạt động khác sử dụng mục đích sử dụng đoạn mã bên dưới này.

intent.putExtra("Bitmap", bitmap); 

Và đối với lấy rằng ý định bitmap trong hoạt động khác sử dụng này

Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap"); 

theo Link for More Detail.

5

Bitmap này thực hiện Parcelable, vì vậy bạn luôn có thể vượt qua nó trong mục đích. thử mã bên dưới:

Hoạt động đầu tiên.

Intent mIntent = new Intent(this, ActivityTwo.class); 
mIntent.putExtra("bmp_img", bmp); 

để nhận ra trong hoạt động mục tiêu, hãy thử:

Hoạt động thứ hai.

Bitmap mBitmap = (Bitmap) intent.getParcelableExtra("bmp_img"); 

bạn luôn sử dụng getParcelableExtra ("key") cho có được Bitmap qua trong hoạt động.

+2

Mã này có thể thất bại nếu Bitmap quá lớn –

+1

@hoặc sự thay thế của Bitmap lớn là gì? –

+0

@AnshulTyagi nếu bạn đang xử lý các ảnh bitmap lớn, bạn có thể lưu chúng vào bộ nhớ trong, chuyển tên tệp trong hoạt động thêm vào thứ hai đọc từ bộ nhớ trong. Tôi sử dụng nó để chuyển ảnh chụp màn hình và nó hoạt động tốt. – cuddlecheek

0

Tôi đã tìm thấy cách dễ nhất (nhưng chắc chắn không phải thanh lịch nhất) là sử dụng thành viên lớp tĩnh. ví dụ:

class PassedData 
{ 
    public Bitmap bm1, bm2, etc; 

    private PassedData current; 

    public static PassedData getCurrent() {return current;} 

    public PassedData() 
    { 
     current = this; 
    } 
} 

Sau đó, mỗi hoạt động có thể tham chiếu PassedData.getCurrent().

0

Hoạt động

Để vượt qua một bitmap giữa Sinh Hoạt

Intent intent = new Intent(this, Activity.class); 
intent.putExtra("bitmap", bitmap); 

Và trong lớp Hoạt động

Bitmap bitmap = getIntent().getParcelableExtra("bitmap"); 

Fragment

Để vượt qua một bitmap giữa mảnh vỡ

SecondFragment fragment = new SecondFragment(); 
Bundle bundle = new Bundle(); 
bundle.putParcelable("bitmap", bitmap); 
fragment.setArguments(bundle); 

Tiếp nhận bên trong SecondFragment

Bitmap bitmap = getArguments().getParcelable("bitmap"); 

Nếu bạn đang nhận được thất bại binder tr ansaction, điều này có nghĩa là bạn vượt quá bộ đệm giao dịch kết dính bằng cách chuyển phần tử lớn từ hoạt động này sang hoạt động khác.

Vì vậy, trong trường hợp đó bạn phải nén các bitmap như mảng của một byte và sau đó giải nén nó trong một hoạt động, như thế này

Trong FirstActivity

Intent intent = new Intent(this, SecondActivity.class); 

ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bitmap.compress(Bitmap.CompressFormat.JPG, 100, stream); 
byte[] bytes = stream.toByteArray(); 
intent.putExtra("bitmapbytes",bytes); 

Và trong SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes"); 
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
Các vấn đề liên quan