2012-06-13 23 views
46

में आशय का उपयोग कर मैं एक बिटमैप चर Activity1 में bmp नामित hava, और मैं activity2पासिंग एंड्रॉयड बिटमैप डाटा एंड्रॉयड

के बाद करने के लिए बिटमैप भेजना चाहते हैं कोड मैं इरादे से इसे पारित करने के लिए उपयोग है।

Intent in1 = new Intent(this, Activity2.class); 
in1.putExtra("image",bmp); 
startActivity(in1); 

और activity2 में मैं निम्नलिखित कोड

Bundle ex = getIntent().getExtras(); 
Bitmap bmp2 = ex.getParceable("image"); 
ImageView result = (ImageView)findViewById(R.Id.imageView1); 
result.setImageBitmap(bmp); 

आवेदन एक अपवाद के बिना चलता है, लेकिन यह उम्मीद परिणाम

+2

यह आपके कोड की प्रति नहीं है, क्योंकि मुझे कम से कम दो टाइपो दिखाई देते हैं। – Christine

+0

@ क्रिस्टीन: यह वास्तव में मेरा कोड है, लेकिन मेरे पास यह कई ट्यूटोरियल से था ... XP –

+1

तो आप बिटमैप बीएमपी 2 कैसे बनाते हैं, और आप इसे setImageBitmap (bmp) के साथ सेट करते हैं? और निश्चित रूप से, R.Id.imageView1 काम नहीं करता है। यह R.id.imageView1 होना चाहिए। – Christine

उत्तर

137

एक बाइट के लिए यह कन्वर्ट नहीं देता का उपयोग कर बिटमैप तक पहुँचने का प्रयास इससे पहले कि आप इसे इरादे में जोड़ दें, इसे भेजें, और डीकोड करें।

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

संपादित

सोचा मैं सबसे अच्छा अभ्यास के साथ इस अद्यतन करना चाहिए:

अपना पहला गतिविधि में, आप को बचाने के लिए करना चाहिए

//Convert to byte array 
ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 
byte[] byteArray = stream.toByteArray(); 

Intent in1 = new Intent(this, Activity2.class); 
in1.putExtra("image",byteArray); 
फिर गतिविधि 2 में

डिस्क पर बिटमैप फिर इसे अगली गतिविधि में लोड करें। कचरा संग्रहण के लिए प्रधानमंत्री इसे करने के लिए पहली गतिविधि में अपने बिटमैप पुनरावृत्ति करने के लिए सुनिश्चित करें:

गतिविधि 1:

try { 
    //Write file 
    String filename = "bitmap.png"; 
    FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE); 
    bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); 

    //Cleanup 
    stream.close(); 
    bmp.recycle(); 

    //Pop intent 
    Intent in1 = new Intent(this, Activity2.class); 
    in1.putExtra("image", filename); 
    startActivity(in1); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

गतिविधि 2 में, बिटमैप लोड:

Bitmap bmp = null; 
String filename = getIntent().getStringExtra("image"); 
try { 
    FileInputStream is = this.openFileInput(filename); 
    bmp = BitmapFactory.decodeStream(is); 
    is.close(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

चीयर्स!

+0

हाँ मुझे लगता है यह एक अच्छा विचार है .. धन्यवाद जेड साइनो: डी –

+1

इसने मेरे पास एक मुद्दा हल किया। एक अपवाद फेंक दिया गया क्योंकि "लेनदेन TULargeException"। एक अतिरिक्त बिटमैप अतिरिक्त भेजते समय। – Reinherd

+0

बेहतर समाधान यहां है http://stackoverflow.com/questions/2459524/how-can-i-pass-a-bitmap-object-from-one-activity-to-another/2459624#2459624 – Nizzy

-7
Bundle b = new Bundle(); 
b.putSerializable("Image", Bitmap); 
mIntent.putExtras(b); 
startActivity(mIntent); 
+5

बिटमैप क्रमबद्ध नहीं है! – Carnal

+0

कृपया इस लिंक को चेक करें: http://stackoverflow.com/questions/5871482/serializing-and-de-serializing-android-graphics-bitmap-in-java –

4

कभी कभी, बिटमैप एनकोड & डिकोड लिए बहुत बड़ा हो या आशय में एक बाइट सरणी के रूप में पारित हो सकता है। इससे ओओएम या खराब यूआई अनुभव हो सकता है।

मैं बिटमैप को नई गतिविधि (जो इसका उपयोग करता है) के एक स्थैतिक चर में डालने पर विचार करने का सुझाव देता है, जब आपको इसकी आवश्यकता नहीं होती है (अर्थात् ऑनस्ट्रॉय में अर्थ है, लेकिन केवल तभी होता है जब "isChangingConfigurations" झूठ देता है) ।

0

हम इरादे के माध्यम से डेटा पास किए बिना इसे हल भी कर सकते हैं। बस छवि को स्मृति में संग्रहीत करें और अगली गतिविधि में बस उस स्थान से छवि लोड करें, जो बड़े बिटमैप डेटा को पार करने से ऐप क्रैश से भी बच सकती है। नोट: आपको इरादे के स्थान पथ को भी पास करने की आवश्यकता नहीं है, पथ याद रखें और इसका उपयोग करें।

0

मैं ऐसा करने के लिए देख रहे लोगों के लिए सर्वोत्तम प्रथाओं का उत्तर भी पोस्ट करना चाहता हूं (लेकिन गलत सवाल पूछ सकता है)।

आसपास बिटमैप पास करने के बजाय (जो मुझे लगता है कि आप नेटवर्क से डाउनलोड करते हैं, अन्यथा, आपके पास पहले से ही एक फ़ाइल संदर्भ होगा), मैं एक छवि लोडर में छवि डाउनलोड करने के लिए Universal Image Loader जैसे छवि लोडर का उपयोग करने की सलाह देता हूं।आप इसे कॉन्फ़िगर तो डिस्क के लिए छवि को कैश करने के कर सकते हैं:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() 
       .cacheInMemory(true) 
       .cacheOnDisk(true) 
       .considerExifParams(true) 
       .bitmapConfig(Bitmap.Config.RGB_565) 
       .build(); 
     ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
       .defaultDisplayImageOptions(defaultOptions) 
       .build(); 

     ImageLoader.getInstance().init(config); 

अब, बस अपने इरादे में चित्र URL गुजरती हैं और छवि को लोड करने UIL का उपयोग करें। उदाहरण के लिए आपकी नव निर्मित गतिविधि में, छवि तुरंत लोड हो जाएगी क्योंकि यह कैश से लोड हो रही है - भले ही आपका छवि यूआरएल डाउनलोड के बाद समाप्त हो गया हो।

0

बस हम बिटमैप ऑब्जेक्ट को पारित करने के बजाए बिटमैप के केवल उरी को पास कर सकते हैं। यदि बिटमैप ऑब्जेक्ट बिग है, तो यह स्मृति समस्या का कारण बन जाएगा।

फर्स्टएक्टिविटी।

intent.putExtra("uri", Uri); 

द्वितीय गतिविधि से हम वापस बिटमैप प्राप्त करते हैं।

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri)); 
+0

IOexception जब मैं यूरी में छवि पथ पास करता हूं। संभावित कारण क्या हो सकता है। –