2009-03-16 7 views
10

मेरे आवेदन के लिए, मैं छवियों और अपने डेटाबेस को लेने के लिए अपनी खुद की कैमरा कक्षा का उपयोग कर रहा था लेकिन जल्द ही मैं वास्तव में बदलावों को जारी नहीं रख सका और मैंने नौकरी करने के लिए एंड्रॉइड में निर्मित कैमरा एप्लिकेशन का उपयोग करने का निर्णय लिया , लेकिन मुझे फ़ाइल को सहेजने के लिए यह प्रतीत नहीं होता है। मुझे यहां क्या समझ नहीं आ रहा है? एप्लिकेशन फ़ाइल को सहेजने लगता है लेकिन यह सिर्फ 0 बाइट्स है। मैंने कैमरा एप्लिकेशन के स्रोत कोड को देखा और यह फ़ाइल को सहेजने के लिए एक्स्ट्रा में "आउटपुट" की तलाश में है। किसी भी तरह की सहायता का स्वागत किया जाएगा।एंड्रॉइड पर मीडियास्टोर का उपयोग करके मैं कैमरे से डिस्क पर डेटा कैसे सहेज सकता हूं?

Public class CameraTest extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button cameraButton = (Button) findViewById(R.id.cameraButton); 
     cameraButton.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v){ 
       ContentValues values = new ContentValues(); 
       values.put(Images.Media.TITLE, "title"); 
       values.put(Images.Media.BUCKET_ID, "test"); 
       values.put(Images.Media.DESCRIPTION, "test Image taken"); 
       Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
       Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
       intent.putExtra("output", uri.getPath()); 
       startActivityForResult(intent,0); 
      } 
     }); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode== 0 && resultCode == Activity.RESULT_OK){ 
      ((ImageView)findViewById(R.id.pictureView)).setImageURI(data.getData()); 
     } 
    } 


} 

उत्तर

14

यह निम्नलिखित कोड के साथ काम करता है, मान लीजिए कि मैं आखिरी के साथ थोड़ा गूंगा था। मुझे अभी भी लगता है कि एक बेहतर तरीका होना चाहिए ताकि मूल छवि अभी भी कहीं भी बचाई जा सके। यह अभी भी मुझे 25% आकार की छवि भेजता है।

public class CameraTest extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    Button cameraButton = (Button) findViewById(R.id.cameraButton); 
    cameraButton.setOnClickListener(new OnClickListener(){ 
     public void onClick(View v){ 

      Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 

      startActivityForResult(intent,0); 
     } 
    }); 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode== 0 && resultCode == Activity.RESULT_OK) { 
     Bitmap x = (Bitmap) data.getExtras().get("data"); 
     ((ImageView)findViewById(R.id.pictureView)).setImageBitmap(x); 
     ContentValues values = new ContentValues(); 
     values.put(Images.Media.TITLE, "title"); 
     values.put(Images.Media.BUCKET_ID, "test"); 
     values.put(Images.Media.DESCRIPTION, "test Image taken"); 
     values.put(Images.Media.MIME_TYPE, "image/jpeg"); 
     Uri uri = getContentResolver().insert(Media.EXTERNAL_CONTENT_URI, values); 
     OutputStream outstream; 
     try { 
      outstream = getContentResolver().openOutputStream(uri); 
      x.compress(Bitmap.CompressFormat.JPEG, 70, outstream); 
      outstream.close(); 
     } catch (FileNotFoundException e) { 
      // 
     } catch (IOException e) { 
      // 
     } 
    } 
} 

इसके अलावा, मुझे पता है कि एंड्रॉइड के कपकेक रिलीज को जल्द ही छोटे छवि आकार को ठीक करना चाहिए।

+1

हे तो यू धन्यवाद इतना तो much.it वास्तव में काम करता है यू – Geetanjali

+0

धन्यवाद: अरे मैं उर कोड का इस्तेमाल किया है, लेकिन मैं एक समस्या पहलू अनुपात और फसल विकल्प है, लेकिन इसके नहीं ले रही पहलू अनुपात क्यों इस्तेमाल किया है है क्या यह असामान्य व्यवहार है? कृपया मेरी मदद करें – Geetanjali

4

आपके पहले प्रयास में, यह हो सकता है कि कैमरा ऐप क्रैश हो जाए जब यह आपके "आउटपुट" को पढ़ता है, क्योंकि यह एक स्ट्रिंग प्रदान करते समय उरी होने की अपेक्षा करता है। फोटो कैप्चर करने के बाद कैमरा ऐप अतिरिक्त ध्वज पढ़ता प्रतीत होता है। आपको सिर्फ यूरी प्रदान करना चाहिए, न कि uri.getPath()। फिर, चूंकि आप पहले ही फोटो को यूआरआई जानते हैं, इसलिए इसे ऑनसेट कॉल में वापस नहीं किया जाएगा। आपको सदस्य चर में यूआरआई याद रखना होगा।

दूसरे प्रयास में आपको एक स्केल डाउन (50%) बिटमैप वापस मिल जाएगा। यह मुख्य रूप से विचारों के लिए है। मुझे लगता है कि पूर्ण आकार का बिटमैप एप्लिकेशन के मेमोरी बजट के लिए बहुत बड़ा है। यह डाउनस्केल का कारण हो सकता है।

+0

समझ में आता है। मुझे बड़ी छवियों के साथ बफर ओवरफ्लो प्रकार की समस्याएं मिल रही हैं या स्क्रीन पर एक से अधिक unscaled छवि के साथ ... – prasanna

0

मुझे एमुलेटर, के साथ एक ही समस्या मिली है, मैंने इसे वास्तविक फोन पर कोशिश की है, यह शायद ऐसा इसलिए है क्योंकि वर्चुअल फोन वास्तव में Picures नहीं ले सकता है।

+0

हाँ आप सही अनुकरणकर्ता कैमरे के साथ काम नहीं करेंगे। –

+0

नोप अनुकरणकर्ता कैमरे के साथ काम करते हैं – Trikaldarshi

4

एफवाईआई, इसे दस्तावेज़ों पर मिला: कॉलर यह छवि कहां लिखा जाएगा यह नियंत्रित करने के लिए एक अतिरिक्त EXTRA_OUTPUT पास कर सकता है। यदि EXTRA_OUTPUT मौजूद नहीं है, तो अतिरिक्त फ़ील्ड में बिटमैप ऑब्जेक्ट के रूप में एक छोटी आकार की छवि लौटा दी जाती है। यह उन अनुप्रयोगों के लिए उपयोगी है जिन्हें केवल एक छोटी छवि की आवश्यकता होती है। यदि EXTRA_OUTPUT मौजूद है, तो पूर्ण आकार की छवि EXTRA_OUTPUT के उरी मान पर लिखी जाएगी।

यहाँ स्थित: http://developer.android.com/reference/android/provider/MediaStore.html

तो अनुप्रयोग, आप के लिए पूर्ण आकार की छवि को बचा सकता है अगर आप इसे जहां बताओ।

** संपादित करें: यह एचटीसी उपकरणों के मामले में नहीं है। एचटीसी (नेक्सस नहीं) जो एचटीसी भावना यूई का उपयोग करता है, एंड्रॉइड 1.5 से ब्रांच किया गया है और एक बग लेता है जो हमेशा छवि को कम रेज में सहेजता है। आप कैमरे के लिए दोपहर का भोजन कर सकते हैं और पूर्ण आकार की छवि का उपयोग करने के लिए कैमरे से शेयर फ़ंक्शन का उपयोग कर सकते हैं।

6

नीचे कोड डिफ़ॉल्ट कैमरा शुरू करेगा और कैमरा को छवि को निर्दिष्ट यूरी में सहेज लें। वांछित यूरी के साथ अतिरिक्त "MediaStore.EXTRA_OUTPUT" डालना कुंजी है।

File file = new File(Environment.getExternalStorageDirectory().getPath() + "/Images/" + image_name + ".jpg"); 
Uri imageUri = Uri.fromFile(file); 

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

startActivityForResult(intent, 0); 
+0

तस्वीर लेने के बाद फ़ाइल को स्वचालित रूप से सहेजने का कोई तरीका है? या उपयोगकर्ता के लिए कैमरे को निकालकर एक तस्वीर लेने के बाद यह तय करना बेहतर होगा। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^