2012-11-27 189 views
6

在我的應用程序中,我從圖庫中顯示no.of圖像,只要我選擇一個圖像,應該將圖像發送到所選圖像將設置的新活動作爲背景。然而,我能夠從圖庫中獲取圖像,但只要我選擇一個應用程序崩潰。提前感謝將位圖圖像從一個活動傳遞到另一個活動

活動-1(圖像顯示在圖庫中,所選圖像發送到新活性)

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


     } 


    } 
} 

活動-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> 

活動-2(其中,所選擇的圖像應該被設置爲屏幕的背景圖像的活動)

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

檢查[this](http://stackoverflow.com/a/6647023/1265724) –

+0

你可以發佈logcat – Prachi

回答

18

有3個解決方案來解決這個問題。

1)首先將圖像轉換爲字節數組,然後傳入Intent,然後在下一個活動中從Bundle獲取字節數組並轉換爲圖像(位圖)並設置爲ImageView。

轉換位圖字節數組: -

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

通行證字節數組到意圖: - 從捆綁

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

獲取字節數組,轉換成位圖圖像: -

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)首先將圖像保存到SDCard中,然後在下一個活動中將此圖像設置爲ImageView。

3)將位圖傳遞給Intent,並從bundle中獲取下一個活動的位圖,但問題是如果您的位圖/圖像大小很大,那麼圖像在下一個活動中不會加載。

+0

:根據你的第一個解決方案,如果我想轉換一個圖像到位圖,我怎麼能去做? –

1

我認爲你可以做的定義位圖靜態和調用classname.bitmap你可以得到bitmap..and設置爲下一個活動的背景

6

因爲你是從庫中檢索圖像,爲什麼不把ID傳遞給下一個活動,並在該活動中檢索圖像而不是傳遞圖像?這將幫助你記憶和表現。

+3

+1,它是最方便的方式。存儲用戶選擇的賬戶ID並將該ID傳遞給下一個活動。 –

0

IGP總結得很清楚,但在我看來,最有效的方法是將圖像的URI傳遞給下一個活動,而不是Bitmap本身。實際上,我不確定是否可以使用Intents將一個活動的數據傳遞到另一個活動的整個Bitmaps(或轉換後的ByteArrays) - 我相信Bundle可以包含多少數據是有限制的。

而是傳遞您用來在第一個活動中顯示圖像的引用。我假設你正在使用某種延遲加載?如果不是,我強烈建議你這樣做。這樣你就可以簡單地通過URI重新查詢位圖。

但是,我能得到從圖庫中的圖片,但只要我 選擇一個應用程序崩潰

我仍然困惑的是這些類型的問題是如何達到SO。檢查日誌,也許你可以自己計算出來。

0

使用此功能可以將位圖傳遞給其他活動。

如果您使用drawable,則首先將該drawable轉換爲位圖。

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

對於使用intent將該位圖傳遞給另一個活動,請使用以下代碼片段。

intent.putExtra("Bitmap", bitmap); 

而對於取另一個動作是位圖的意圖使用該

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

關注這個 Link for More Detail.

5

位圖實現Parcelable,所以你總是可以通過它的意圖。請嘗試以下代碼:

第一個活動。

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

在目標活動獲得輸出,嘗試:

次活動。

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

你總是使用getParcelableExtra( 「密鑰」)在活動獲得通過位圖。

+2

如果位圖太大,此代碼可能會失敗 –

+1

@oren大型位圖的替代選擇是什麼? –

+0

@AnshulTyagi如果你正在處理大的位圖,你可以將它們保存到內部存儲器中,將文件名額外傳遞給從內部存儲器讀取它的第二個活動。我用它來傳輸屏幕截圖,效果很好。 – cuddlecheek

0

我發現最簡單的(但絕對不是最優雅的)方法是使用靜態類成員。例如:

class PassedData 
{ 
    public Bitmap bm1, bm2, etc; 

    private PassedData current; 

    public static PassedData getCurrent() {return current;} 

    public PassedData() 
    { 
     current = this; 
    } 
} 

然後,每個活動都可以引用PassedData.getCurrent()。

0

活動

要傳遞Activites

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

Bitmap bitmap = getIntent().getParcelableExtra("bitmap"); 
之間以及在活動類的位圖

片段

要通過片段

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

之間的位圖來接收SecondFragment

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

如果您收到失敗粘結劑TR內ansaction,這意味着您將大元素從一個活動轉移到另一個活動,從而超越了活頁夾事務緩衝區。

因此,在這種情況下,你要壓縮的位圖作爲一個字節的數組,然後在另一個活動解壓,這樣

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

而在SecondActivity

byte[] bytes = getIntent().getByteArrayExtra("bitmapbytes"); 
Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length); 
相關問題