2012-11-27 28 views
6

मेरे ऐप में मैं गैलरी से छवियों को प्रदर्शित नहीं कर रहा हूं, जहां से मैं एक छवि का चयन करता हूं, छवि को नई गतिविधि में भेजा जाना चाहिए जहां चयनित छवि सेट की जाएगी पृष्ठभूमि के रूप में। हालांकि, मैं गैलरी से छवियां प्राप्त करने में सक्षम हूं लेकिन जैसे ही मैं एक चुनता हूं, एप्लिकेशन क्रैश हो जाता है। अग्रिम धन्यवादएक गतिविधि से दूसरे गतिविधि में एक बिटमैप छवि पास करें

गतिविधि -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

चेक [इस] (http://stackoverflow.com/a/6647023/1265724) –

+0

आप पोस्ट logcat – Prachi

उत्तर

18

इस समस्या को हल करने के लिए 3 समाधान कर रहे हैं।

1) पहली बार बाइट ऐरे में छवि को कनवर्ट करें और फिर इरादे में जाएं और अगली गतिविधि में बंडल से बाइट सरणी प्राप्त करें और छवि (बिटमैप) में कनवर्ट करें और ImageView में सेट करें। बाइट सरणी के लिए

Convert बिटमैप: - उद्देश्य के बारे में

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) पहले एसडीकार्ड में छवि सहेजें और अगली गतिविधि में इस छवि को ImageView में सेट करें।

3) बिटमैप को इरादे में पास करें और बंडल से अगली गतिविधि में बिटमैप प्राप्त करें, लेकिन समस्या यह है कि उस समय आपकी बिटमैप/छवि का आकार बड़ा होता है, तो छवि अगली गतिविधि में लोड नहीं होती है।

+0

कर सकते हैं: अपने 1 समाधान के अनुसार, अगर मैं एक बिटमैप के लिए एक imageView परिवर्तित करना चाहते हैं, कैसे मैं कर सकता हूँ वो करें? –

1

मुझे लगता है कि आप ऐसा कर सकते हैं स्थिर के रूप में अपने बिटमैप को परिभाषित करने और classname.bitmap फोन करके आप कर सकते हैं bitmap..and अगले गतिविधि में पृष्ठभूमि के रूप में सेट

6

जब से तुम गैलरी से छवि को पुन: प्राप्त कर रहे हैं , आईडी को अगली गतिविधि में क्यों न दें और छवि को पास करने के बजाय उस गतिविधि में छवि को पुनर्प्राप्त करें? यह आपको स्मृति और प्रदर्शन पर मदद करेगा।

+3

+1, यह सबसे सुविधाजनक तरीका है। उस इमेज आईडी को स्टोर करें जो उपयोगकर्ता उस आईडी को अगली गतिविधि में चुनता है और पास करता है। –

0

आईजीपी ने इसे स्पष्ट रूप से समझाया, लेकिन मेरी राय में यह करने का सबसे प्रभावी तरीका छवि के यूआरआई को बिटमैप के बजाए अगली गतिविधि में भेजकर है। मुझे वास्तव में यह सुनिश्चित नहीं है कि इरादों का उपयोग करके एक गतिविधि से दूसरे गतिविधि में डेटा के पूरे बिटमैप्स (या, रूपांतरित, बाइटअरेज़) को पास करना संभव है - मेरा मानना ​​है कि बंडल में कितना डेटा हो सकता है, इस पर एक सीमा है।

इसके बजाय उस संदर्भ को पारित करें जिसका उपयोग आप पहली गतिविधि में छवि को प्रदर्शित करने के लिए कर रहे हैं। मुझे लगता है कि आप किसी प्रकार की आलसी लोडिंग का उपयोग कर रहे हैं? यदि नहीं, तो मैं आपको सुझाव देता हूं कि आप ऐसा करें। इस तरह आप बस यूआईआरआई के माध्यम से बिटमैप के लिए फिर से पूछ सकते हैं।

हालांकि, मैं गैलरी से चित्र प्राप्त करने में सक्षम हूँ लेकिन जैसे ही मैं किसी एक का चयन के रूप में आवेदन दुर्घटनाओं

मैं अभी भी हैरान हूँ के लिए कैसे समस्याओं के इन प्रकार के एसओ तक पहुँचने के रूप में। लॉग की जांच करें, हो सकता है कि आप इसे स्वयं ही समझ सकें।

0

इसका उपयोग करके आप किसी अन्य गतिविधि में बिटमैप पास कर सकते हैं।

यदि आप पहली बार बिटमैप में खींचने योग्य रूपांतरित करने से ड्रायबल का उपयोग कर रहे हैं।

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

उस बिटमैप को अन्य गतिविधि में पास करने के लिए इस उद्देश्य कोड स्निपेट का उपयोग करके उपयोग करें।

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

गतिविधि

गतिविधियों के बीच

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

तुम असफल हो रहे हैं तो बांधने की मशीन टीआर अंदर प्राप्त करने के लिए जवाब, इसका मतलब है कि आप एक गतिविधि से दूसरे गतिविधि में बड़े तत्व को स्थानांतरित करके बाइंडर लेनदेन बफर से अधिक हो रहे हैं।

तो उस मामले में आप एक बाइट के सरणी के रूप में बिटमैप सेक और फिर एक और गतिविधि में उसे असंपीड़ित, इस

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

में की तरह करने के लिए है और द्वितीय एक्टिविटी

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