Android ACTION_IMAGE_CAPTURE इरादे


163

हम उपयोगकर्ता को नई तस्वीर लेने के लिए देशी कैमरा ऐप का उपयोग करने की कोशिश कर रहे हैं। यदि हम बाहर निकलते हैं EXTRA_OUTPUT extraऔर छोटी बिटमैप छवि लौटाते हैं तो यह ठीक काम करता है । हालांकि, अगर हम putExtra(EXTRA_OUTPUT,...)इसे शुरू करने से पहले इरादे पर हैं , तो कैमरा ऐप में "ओके" बटन को हिट करने की कोशिश करने तक सब कुछ काम करता है। "ओके" बटन सिर्फ कुछ नहीं करता है। कैमरा ऐप खुला रहता है और कुछ भी लॉक नहीं होता है। हम इसे रद्द कर सकते हैं, लेकिन फ़ाइल कभी नहीं लिखी जाती है। ACTION_IMAGE_CAPTUREफ़ाइल में ली गई तस्वीर को लिखने के लिए हमें वास्तव में क्या करना होगा ?

संपादित करें: यह MediaStore.ACTION_IMAGE_CAPTUREकेवल स्पष्ट होने के इरादे से किया जाता है

जवाबों:


144

यह एंड्रॉइड के कुछ संस्करणों में एक अच्छी तरह से प्रलेखित बग है। यही कारण है कि, Android के Google अनुभव बिल्ड पर, छवि कैप्चर दस्तावेज़ के रूप में काम नहीं करता है। क्या मैं आमतौर पर इस्तेमाल किया है एक उपयोगिता वर्ग में इस तरह से कुछ है।

public boolean hasImageCaptureBug() {

    // list of known devices that have the bug
    ArrayList<String> devices = new ArrayList<String>();
    devices.add("android-devphone1/dream_devphone/dream");
    devices.add("generic/sdk/generic");
    devices.add("vodafone/vfpioneer/sapphire");
    devices.add("tmobile/kila/dream");
    devices.add("verizon/voles/sholes");
    devices.add("google_ion/google_ion/sapphire");

    return devices.contains(android.os.Build.BRAND + "/" + android.os.Build.PRODUCT + "/"
            + android.os.Build.DEVICE);

}

तब जब मैं छवि कैप्चर करता हूं, तो मैं एक इरादा बनाता हूं जो बग की जांच करता है।

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (hasImageCaptureBug()) {
    i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/tmp")));
} else {
    i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
startActivityForResult(i, mRequestCode);

फिर मैं जिस गतिविधि में लौटता हूं, मैं डिवाइस के आधार पर अलग-अलग चीजें करता हूं।

protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
     switch (requestCode) {
         case GlobalConstants.IMAGE_CAPTURE:
             Uri u;
             if (hasImageCaptureBug()) {
                 File fi = new File("/sdcard/tmp");
                 try {
                     u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
                     if (!fi.delete()) {
                         Log.i("logMarker", "Failed to delete " + fi);
                     }
                 } catch (FileNotFoundException e) {
                     e.printStackTrace();
                 }
             } else {
                u = intent.getData();
            }
    }

यह आपको एक नया कैमरा ऐप लिखने के लिए बचाता है, लेकिन यह कोड या तो महान नहीं है। बड़ी समस्याएं हैं

  1. बग के साथ उपकरणों से आपको कभी भी पूर्ण आकार के चित्र नहीं मिलते हैं। आपको चित्र प्राप्त होते हैं जो 512px चौड़े होते हैं जो छवि सामग्री प्रदाता में डाले जाते हैं। बग के बिना उपकरणों पर, सब कुछ दस्तावेज़ के रूप में काम करता है, आपको एक बड़ी सामान्य तस्वीर मिलती है।

  2. आपको सूची को बनाए रखना होगा। जैसा कि लिखा गया है, यह संभव है कि उपकरणों को एंड्रॉइड के एक संस्करण के साथ फ्लैश किया जाए (जैसे कि सियानोजेनमॉड का निर्माण ) जिसमें बग को ठीक किया गया है। यदि ऐसा होता है, तो आपका कोड क्रैश हो जाएगा। फिक्स पूरे डिवाइस फिंगरप्रिंट का उपयोग करना है।


21
गैलेक्सी S पर: आशय .getData (), null, और इसके अलावा, गैलेक्सी s पर कैमरा ऐप स्वयं के द्वारा गैलरी में नई फ़ोटो सम्मिलित करता है, लेकिन कोई भी uri वापस नहीं आया। इसलिए यदि आप गैलरी से फाइल में फोटो डालते हैं, तो डुप्लिकेट फोटो होगी।
आर्सेनि

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

Droid-x और Sony xpheria उपकरणों पर इस कोड का उपयोग करना। दोनों डिवाइस नल के रूप में आशय मान लौटाते हैं। droidx भी परिणाम 1 के रूप में देता है जबकि xpheria परिणाम 1 के रूप में देता है। कोई भी जानता है कि ऐसा क्यों होना चाहिए।
रबेलिग

5
"अच्छी तरह से प्रलेखित बग" का लिंक जो यानोकवा के उत्तर की शुरुआत में गलत है। वह बग बिना putExtra (EXTRA_OUTPUT, ...)
फ्रैंक हार्पर

code.google.com/p/android/issues/detail?id=1480 खैर, आप इसे कैसे समझाते हैं?
पेन्सिलचेक

50

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

मेरी नेक्सस वन पर भी यही समस्या थी। यह कैमरा ऐप शुरू होने से पहले डिस्क पर मौजूद फाइल से नहीं था। इसलिए, मैंने यह सुनिश्चित किया कि कैमरा ऐप शुरू करने से पहले मौजूद फ़ाइल। यहाँ कुछ नमूना कोड का उपयोग किया गया है:

String storageState = Environment.getExternalStorageState();
        if(storageState.equals(Environment.MEDIA_MOUNTED)) {

            String path = Environment.getExternalStorageDirectory().getName() + File.separatorChar + "Android/data/" + MainActivity.this.getPackageName() + "/files/" + md5(upc) + ".jpg";
            _photoFile = new File(path);
            try {
                if(_photoFile.exists() == false) {
                    _photoFile.getParentFile().mkdirs();
                    _photoFile.createNewFile();
                }

            } catch (IOException e) {
                Log.e(TAG, "Could not create file.", e);
            }
            Log.i(TAG, path);

            _fileUri = Uri.fromFile(_photoFile);
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE );
            intent.putExtra( MediaStore.EXTRA_OUTPUT, _fileUri);
            startActivityForResult(intent, TAKE_PICTURE);
        }   else {
            new AlertDialog.Builder(MainActivity.this)
            .setMessage("External Storeage (SD Card) is required.\n\nCurrent state: " + storageState)
            .setCancelable(true).create().show();
        }

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

अब, जब कैमरा ऐप पर ओके बटन दबाया जाता है, तो फ़ाइल दिए गए स्थान पर मौजूद होगी। इस उदाहरण में यह /sdcard/Android/data/com.example.myapp/files/234asdioue23498ad.jpg होगा

फ़ाइल को "onActivityResult" में कॉपी करने की आवश्यकता नहीं है जैसा कि ऊपर पोस्ट किया गया है।


13
सुनिश्चित करें कि <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />यदि आप Android 1.5 की तुलना में नया उपयोग कर रहे हैं, तो आप अपने मेनिफेस्ट में हैं - कैमरा सामान डिबग करने में कुछ घंटे बिताए और यह शामिल नहीं था इसलिए मेरी बचत हमेशा विफल रहेगी।
21

यह मेरे लिए अच्छा काम करता है, लेकिन हर 10 छवियों या तो के बारे में, खाली फ़ाइल को अधिलेखित नहीं किया जाता है और मैं 0 बाइट फ़ाइल के साथ समाप्त होता हूं जहां छवि होनी चाहिए। यह बहुत कष्टप्रद है और नीचे ट्रैक करना कठिन हो गया है।
joey_g216

2
जेली बीन के साथ नेक्सस 7 जैसे कुछ उपकरणों पर, आपको पर्यावरण .getExternalStorageDirectory () को बदलने की आवश्यकता है। .Name () का उपयोग करने के लिए .getAbsolutePath () के बजाय .getName ()
कीथ

35

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

mPhotoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, 
            new ContentValues());
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mPhotoUri);
startActivityForResult(intent,CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE_CONTENT_RESOLVER);

चर्चा में आगे योगदान करने और नए लोगों की मदद करने के लिए मैंने एक नमूना / परीक्षण ऐप बनाया है जो फोटो कैप्चर कार्यान्वयन के लिए कई अलग-अलग रणनीतियों को दिखाता है। अन्य कार्यान्वयन के योगदानों को निश्चित रूप से चर्चा में जोड़ने के लिए प्रोत्साहित किया जाता है।

https://github.com/deepwinter/AndroidCameraTester


यह बहुत अच्छा था। मैंने अभी तक अपने सभी उपकरणों में इसका परीक्षण किया है, लेकिन मैं यह मान रहा हूं कि आपने पहले ही काफी कुछ कर लिया है। इस विषय पर इतना शोर है, और यह विशेष उत्तर इतना सरल और साफ है। नेक्सस 5 पर अब तक काम करता है, जो कि मुझे पहली बार ऐसी रिपोर्ट मिली है जिसमें EXIONRA_OUTPUT के बिना ACTION_IMAGE_CAPTURE काम नहीं कर रहा था। मुझे उम्मीद है कि यह बोर्ड भर में काम करता है, लेकिन अभी तक बहुत अच्छा है। Thx
रिच

1
@deepwinter - धन्यवाद सर। मैं अपने बालों को बाहर निकाल रहा था, लेकिन आपकी सामग्री रिज़ॉल्वर समाधान उन सभी समस्याग्रस्त परिदृश्यों पर अच्छी तरह से काम करता है जो मेरे पास थे।
बिली कॉवर

इस पार्टी के लिए देर से ही सही लेकिन यह मेरे लिए काम करने का एकमात्र समाधान रहा है। बहुत बहुत धन्यवाद!
स्टैकजप

क्या मैं किसी तरह MediaStore.EXTRA_OUTPUT को पुनः प्राप्त कर सकता हूं onActivityResultया मुझे वास्तव में इसे स्वयं याद रखना होगा? मुझे इसे लगातार सहेजना होगा ताकि मेरा ऐप भी इसे याद रखे, अगर यह फोटो लेते समय नष्ट हो जाए ...
prom85

यह लॉलीपॉप के साथ सैमसंग गैलेक्सी नोट 3 पर काम नहीं करता है: ava.lang.NullPointerException: आभासी विधि 'java.lang.String android.net.Uri.getScasse ()' को एक अशक्त वस्तु संदर्भ पर लागू करने का प्रयास
इगोर Janković

30

मुझे एक ही समस्या थी जहां कैमरा ऐप में ओके बटन ने कुछ भी नहीं किया, दोनों एमुलेटर और नेक्सस एक पर।

एक सुरक्षित फ़ाइल नाम निर्दिष्ट करने के बाद समस्या दूर हो गई, जो सफेद रिक्त स्थान के बिना है, विशेष वर्णों के बिना, MediaStore.EXTRA_OUTPUT इसके अलावा, यदि आप एक ऐसी फ़ाइल को निर्दिष्ट कर रहे हैं जो एक निर्देशिका में रहती है जो अभी तक नहीं बनाई गई है, तो आपको इसे पहले बनाना होगा। कैमरा ऐप आपके लिए mkdir नहीं करता है।


1
और सुनिश्चित करें कि आप mkdirs()इसके बजाय इसका उपयोग करते हैं mkdir()यदि आपके पथ में एक से अधिक निर्देशिका स्तर हैं और आप उन सभी को बनाना चाहते हैं ( mkdirकेवल अंतिम बनाता है, 'पत्ती' निर्देशिका)। मुझे इसके साथ कुछ समस्याएं थीं, और इस जवाब से मुझे मदद मिली।
डायना

क्या हम साधारण टाइमस्टैम्प का उपयोग कर सकते हैं ?? या कुछ त्रुटियां भी कर सकते हैं ??
दलील

@ user2247689 "सरल टाइमस्टैम्प" द्वारा आपके द्वारा बनाए गए फ़ाइल नाम के बारे में मुझे यकीन नहीं है, लेकिन जब तक वे विशेष वर्णों को शामिल नहीं करते हैं जो एफएटी प्रारूप द्वारा एसडी कार्ड पर अनुमति नहीं देते हैं यह ठीक होना चाहिए, मुझे लगता है।
येनची

28

आपके द्वारा वर्णित वर्कफ़्लो को आपके द्वारा वर्णित के अनुसार काम करना चाहिए। यदि आप हमें आशय के निर्माण के आसपास कोड दिखा सकते हैं तो यह मदद कर सकता है। सामान्य तौर पर, निम्नलिखित पैटर्न को आपको वह करने देना चाहिए जो आप कर रहे हैं।

private void saveFullImage() {
  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  File file = new File(Environment.getExternalStorageDirectory(), "test.jpg");
  outputFileUri = Uri.fromFile(file);
  intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
  startActivityForResult(intent, TAKE_PICTURE);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if ((requestCode == TAKE_PICTURE) && (resultCode == Activity.RESULT_OK)) {
    // Check if the result includes a thumbnail Bitmap
    if (data == null) {    
      // TODO Do something with the full image stored
      // in outputFileUri. Perhaps copying it to the app folder
    }
  }
}

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


यह / चाहिए / काम, लेकिन कैमरा ऐप का ओके बटन कुछ नहीं करता है। हमें यह एसडी कार्ड में लिखने का काम कर रहा था, इसलिए मुझे संदेह है कि यह एक फ़ाइल अनुमति समस्या है (हालांकि मुझे लगा कि किसी एप्लिकेशन ने स्वचालित रूप से व्यक्तिगत निर्देशिका के लिए अनुमति लिख दी थी)। सहायता के लिए धन्यवाद!
ड्रयू

1
आपके ऐप ने व्यक्तिगत निर्देशिका को लिखने की अनुमति दी है - कैमरा ऐप (जो तस्वीर ले रहा है) नहीं करता है। आप फ़ाइल को onActivityResult में स्थानांतरित कर सकते हैं, हालांकि यह आपके ऐप के भीतर है। वैकल्पिक रूप से आप स्वयं एक कैमरा गतिविधि कार्यान्वित कर सकते हैं, लेकिन यह ओवरकिल लगता है।
रेटो मीयर

कैमरा ऐप को फिर से करना एक सामान्य लेकिन थकाऊ दृष्टिकोण लगता है ... जब हम getDir ("चित्र", MODE_WORLD_WRITEABLE) का उपयोग करते हैं, तो क्या वह अनुमति किसी भी फ़ाइल पर लागू नहीं होती है जिसे हम उस निर्देशिका में बनाने के लिए कहते हैं?
ड्रयू

जरुरी नहीं। अनुमति फ़ोल्डर के लिए है, जरूरी नहीं कि इसके भीतर फाइलों के लिए।
रेटो मीयर

मैंने एंड्रॉइड 2.2 और नए के साथ एंड्रॉइड डिवाइस के साथ कोड का परीक्षण किया और उनमें से सभी ने आपूर्ति पथ पर छवि को बचाया। इसलिए मुझे लगता है कि छवियों को प्राप्त करने के लिए यह मानक व्यवहार होना चाहिए।
Janusz

7

ऊपर से येनची की टिप्पणी का पालन करने के लिए, ठीक बटन भी कुछ नहीं करेगा यदि कैमरा ऐप प्रश्न में निर्देशिका को नहीं लिख सकता है।

इसका मतलब है कि आप फ़ाइल को ऐसे स्थान पर नहीं बना सकते हैं जो केवल आपके एप्लिकेशन द्वारा लिखित हो (उदाहरण के लिए, काम करने के लिए कुछ के तहत getCacheDir())कुछ getExternalFilesDir(), हालाँकि।

यह अच्छा होगा यदि कैमरा ऐप लॉग्स में एक त्रुटि संदेश मुद्रित करता है यदि यह निर्दिष्ट EXTRA_OUTPUTपथ पर नहीं लिख सकता है , लेकिन मुझे एक नहीं मिला।


4

sdcard के लिए कैमरा लिखने के लिए है, लेकिन मैं इस का उपयोग गैलरी app पर एक नया एल्बम में रखने के लिए:

 File imageDirectory = new File("/sdcard/signifio");
          String path = imageDirectory.toString().toLowerCase();
           String name = imageDirectory.getName().toLowerCase();


            ContentValues values = new ContentValues(); 
            values.put(Media.TITLE, "Image"); 
            values.put(Images.Media.BUCKET_ID, path.hashCode());
            values.put(Images.Media.BUCKET_DISPLAY_NAME,name);

            values.put(Images.Media.MIME_TYPE, "image/jpeg");
            values.put(Media.DESCRIPTION, "Image capture by camera");
           values.put("_data", "/sdcard/signifio/1111.jpg");
         uri = getContentResolver().insert( Media.EXTERNAL_CONTENT_URI , values);
            Intent i = new Intent("android.media.action.IMAGE_CAPTURE"); 

            i.putExtra(MediaStore.EXTRA_OUTPUT, uri);

            startActivityForResult(i, 0); 

कृपया ध्यान दें कि आपको हर बार एक अद्वितीय फ़ाइल नाम उत्पन्न करना होगा और 1111.jpg को बदलना होगा जो मैंने लिखा था। यह नेक्सस एक के साथ परीक्षण किया गया था। uri को निजी कक्षा में घोषित किया गया है, इसलिए गतिविधि के परिणाम पर मैं जरूरत पड़ने पर पूर्वावलोकन के लिए छवि को uri से imageView में लोड करने में सक्षम हूं।


"_data" कॉलम कहाँ से आता है? क्या इसके लिए कोई स्थिर नहीं है?
मथायस

3
आह, यह developer.android.com/reference/android/provider/… है। आपको वास्तव में कोड में जादू के तार का उपयोग नहीं करना चाहिए।
मथियास

1

मेरे पास एक ही मुद्दा था और मैंने इसे निम्नलिखित के साथ तय किया:

समस्या यह है कि जब आप एक ऐसी फ़ाइल निर्दिष्ट करते हैं जिसमें केवल आपके ऐप की पहुंच होती है (जैसे कॉल करके getFileStreamPath("file");)

यही कारण है कि मैंने अभी सुनिश्चित किया है कि दी गई फ़ाइल वास्तव में मौजूद है और हर किसी ने इस तक पहुंच लिख दी है।

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File outFile = getFileStreamPath(Config.IMAGE_FILENAME);
outFile.createNewFile();
outFile.setWritable(true, false);
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT,Uri.fromFile(outFile));
startActivityForResult(intent, 2);

इस तरह, कैमरा ऐप में दिए गए उड़ी का उपयोग लिखा है और ओके बटन ठीक काम करता है :)


AndroidRuntime (2.1 एमुलेटर) NoSuchMethodError को फेंकता है: java.io.File.setWritable
jwadsack

1

मैं आपको फोटो कैप्चर करने के लिए एंड्रॉइड ट्रेनिंग पोस्ट का पालन करने की सलाह देता हूं। वे एक उदाहरण में दिखाते हैं कि कैसे छोटे और बड़े चित्र लेने हैं। आप यहां से सोर्स कोड भी डाउनलोड कर सकते हैं


0

मैंने सरल पुस्तकालय बनाया जो विभिन्न स्रोतों (गैलरी, कैमरा) से छवियों को चुनने का प्रबंधन करेगा, शायद इसे कुछ स्थान (एसडी-कार्ड या आंतरिक मेमोरी) में सहेजें और छवि को वापस लौटाएं ताकि कृपया इसका उपयोग करने के लिए स्वतंत्र रहें और इसे सुधारें - Android-ImageChooser


आपका लिंक अब काम नहीं कर रहा है !! क्यों, मैंने इसे 2 सप्ताह पहले देखा था, और मैं इसका इस्तेमाल करना चाहता था :(
मोहम्मद एरसन

0

प्रवीण ने बताया कि फ़ाइल को कैमरे द्वारा लिखने योग्य होना चाहिए ।

मेरे उपयोग में मैं फ़ाइल को आंतरिक संग्रहण में संग्रहीत करना चाहता था। मैंने इसके साथ किया:

Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (i.resolveActivity(getPackageManager()!=null)){
    try{
        cacheFile = createTempFile("img",".jpg",getCacheDir());
        cacheFile.setWritavle(true,false);
    }catch(IOException e){}
    if(cacheFile != null){
        i.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(cacheFile));
        startActivityForResult(i,REQUEST_IMAGE_CAPTURE);
    }
}

यहां cacheFileएक वैश्विक फ़ाइल का उपयोग उस फ़ाइल को संदर्भित करने के लिए किया जाता है जो लिखी गई है। फिर परिणाम विधि में लौटा हुआ इरादा शून्य है। तब इरादे को संसाधित करने की विधि इस तरह दिखती है:

protected void onActivityResult(int requestCode,int resultCode,Intent data){
    if(requestCode != RESULT_OK){
        return;
    }
    if(requestCode == REQUEST_IMAGE_CAPTURE){
        try{
            File output = getImageFile();
            if(output != null && cacheFile != null){
                copyFile(cacheFile,output);

                //Process image file stored at output

                cacheFile.delete();
                cacheFile=null;
            }
        }catch(IOException e){}
    }
}

यहां getImageFile()उस फ़ाइल को नाम देने और बनाने के लिए एक उपयोगिता विधि है जिसमें छवि संग्रहीत की जानी चाहिए, और copyFile()एक फ़ाइल की प्रतिलिपि बनाने की एक विधि है।


0

आप इस कोड का उपयोग कर सकते हैं

private Intent getCameraIntent() {

    PackageManager packageManager = mContext.getPackageManager();
    List<ApplicationInfo> list = packageManager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
    Intent main = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    List<ResolveInfo> launchables = packageManager.queryIntentActivities(main, 0);
    if (launchables.size() == 1)
        return packageManager.getLaunchIntentForPackage(launchables.get(0).activityInfo.packageName);
    else
        for (int n = 0; n < list.size(); n++) {
            if ((list.get(n).flags & ApplicationInfo.FLAG_SYSTEM) == 1) {
                Log.d("TAG", "Installed Applications  : " + list.get(n).loadLabel(packageManager).toString());
                Log.d("TAG", "package name  : " + list.get(n).packageName);
                String defaultCameraPackage = list.get(n).packageName;


                if (launchables.size() > 1)
                    for (int i = 0; i < launchables.size(); i++) {
                        if (defaultCameraPackage.equals(launchables.get(i).activityInfo.packageName)) {
                            return packageManager.getLaunchIntentForPackage(defaultCameraPackage);
                        }
                    }
            }
        }
    return null;
}

0

इस समस्या को हल करने के लिए बहुत ही सरल है गतिविधि परिणाम कोड सरल इस विधि का प्रयास करें

if (reqCode == RECORD_VIDEO) {
   if(resCode == RESULT_OK) {
       if (uri != null) {
           compress();
       }
    } else if(resCode == RESULT_CANCELED && data!=null){
       Toast.makeText(MainActivity.this,"No Video Recorded",Toast.LENGTH_SHORT).show();
   }
}

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

0
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_CANCELED)
    {
        //do not process data, I use return; to resume activity calling camera intent
        enter code here
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.