2012-01-25 14 views
16

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

सबकुछ ठीक काम कर रहा है, लेकिन मुझे अब दो रिपोर्ट मिल गई हैं जो दावा करती हैं कि एक फोटो लेने के बाद, और कैमरे से बाहर निकलने के लिए "संपन्न" पर क्लिक करके (गतिविधि पर वापस लौटें), ऐप को मजबूर किया गया है , उपयोगकर्ता को वापस होम स्क्रीन पर ला रहा है।

यह सैमसंग नेक्सस एस और गैलेक्सी टैब पर होता है। नीचे मैंने अपना कोड पोस्ट करने के लिए पोस्ट किया है, मैंने अपना इरादा स्थापित किया है और मैं एक्टिविटी रिसैट() पर फोटो को सहेजने और प्रदर्शित करने में कैसे संभालता हूं। कैमरा ऐप से बाहर निकलने के लिए "संपन्न" पर क्लिक करने के बाद क्या हो सकता है, इस पर कोई मार्गदर्शन, बहुत सराहना की जाएगी!

फिर से, यह ज्यादातर उपकरणों पर ठीक काम करता प्रतीत होता है लेकिन मैं सोच रहा था कि क्या यह एक अधिक कुशल, सार्वभौमिक दृष्टिकोण है जिसे मुझे लेना चाहिए। मैं कैसे कैमरा आशय() फायरिंग कर रहा हूँ

case ACTION_BAR_CAMERA: 

     // numbered image name 
     fileName = "image_" + String.valueOf(numImages) + ".jpg"; 


     output = new File(direct + File.separator + fileName); // create 
                    // output 
     while (output.exists()) { // while the file exists 
      numImages++; // increment number of images 
      fileName = "image_" + String.valueOf(numImages) + ".jpg"; 
      output = new File(outputFolder, fileName); 


     } 
     camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     uriSavedImage = Uri.fromFile(output); // get Uri of the output 
     camera.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage); //pass in Uri to camera intent 
     startActivityForResult(camera, 1); 


     break; 
    default: 
     return super.onHandleActionBarItemClick(item, position); 
    } 
    return true; 
} 

मैं कैसे onActivityResult सेट कर रहा हूं

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK) { // If data was passed successfully 

     Bundle extras = data.getExtras(); 

     //Bundle extras = data.getBundleExtra(MediaStore.EXTRA_OUTPUT); 

     /*ad = new AlertDialog.Builder(this).create(); 
     ad.setIcon(android.R.drawable.ic_menu_camera); 
     ad.setTitle("Save Image"); 
     ad.setMessage("Save This Image To Album?"); 
     ad.setButton("Ok", this); 

     ad.show();*/ 



     bmp = (Bitmap) extras.get("data"); // Set the bitmap to the bundle 
              // of data that was just 
              // received 
     image.setImageBitmap(bmp); // Set imageview to image that was 
            // captured 
     image.setScaleType(ScaleType.FIT_XY); 


    } 

} 
+0

क्या आप इसे बताए गए उन दो उपकरणों में से एक को एवीडी अनुकरण करने के लिए प्राप्त कर सकते हैं? – EGHDK

+0

क्रैश स्टैक ट्रेस – marmor

+0

पोस्ट करें क्या डेवलपर कंसोल में स्टैक निशान हैं? इससे बहुत मदद मिलेगी। – nhaarman

उत्तर

0

मैं एक ही मुद्दे का सामना करना पड़ा आप

धन्यवाद। स्पष्ट रूप से यह तय करना है कि uriSavedImage को स्थिर के रूप में बनाना है। यकीन नहीं है कि यह सबसे अच्छा तरीका है। लेकिन यह मेरे लिए काम करता है।

+0

प्रतिक्रिया के लिए धन्यवाद, मैं अभी इसे आज़माउंगा! –

+0

कोई किस्मत आदमी नहीं। मुझे एक्टिविटी रिसेट "फेलिड डिलिवरी गतिविधि परिणाम" में एक त्रुटि मिल रही है। कोई विचार? –

1

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

... 
    // save your file uri, not necessarily static 
    mUriSavedImage = Uri.fromFile(output); 
    startActivityForResult(camera, MY_REQUEST_CODE); 
    /* Make a String like "com.myname.MY_REQUEST_CODE" and hash it into int to give it 
    a bit of uniqueness */ 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_REQUEST_CODE) { 
     if (resultCode == RESULT_OK) { 
      Bitmap bmp = BitmapFactory.decodeFile(mUriSavedImage); 
      if (bmp != null) { 
       image.setImageBitmap(bmp); // Set imageview to image that was 
           // captured 
       image.setScaleType(ScaleType.FIT_XY); 
      } else { 
       Toast.makeText(this, "Something went wrong", Toast.LENGTH_SHORT).show(); 
      } 
     } 
    } else { 
     super.onActivityResult(requestCode, resultCode, data); 
    } 
} 
30

सबसे पहले करने की सुविधा देता यह स्पष्ट है - हम दो विकल्प में छवि डेटा ले जाना है कैमरे से एक्टिविटी रिसर्च:

1.सटीक स्थान को पार करके कैमरा प्रारंभ करें जहां आप सहेजना चाहते हैं।

2.बस स्टार्ट कैमरा किसी भी ऋण उरी को पास न करें।


1।

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (RESULT_OK == resultCode) { 
     iv = (ImageView) findViewById(R.id.ReturnedImageView); 

     // Decode it for real 
     BitmapFactory.Options bmpFactoryOptions = new BitmapFactory.Options(); 
     bmpFactoryOptions.inJustDecodeBounds = false; 

     //imageFilePath image path which you pass with intent 
     Bitmap bmp = BitmapFactory.decodeFile(imageFilePath, bmpFactoryOptions); 

     // Display it 
     iv.setImageBitmap(bmp); 
    }  
} 

2:

String imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/picture.jpg"; 
File imageFile = new File(imageFilePath); 
Uri imageFileUri = Uri.fromFile(imageFile); // convert path to Uri 

Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
it.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageFileUri); 
startActivityForResult(it, CAMERA_RESULT); 

onActivityResult में के रूप में छवि प्राप्त करते हैं: छवि उरी गुजर जहां सहेजना चाहते द्वारा

प्रारंभ कैमरा: पहले मामले में।दूसरे मामले में:

अगर आप आशय में छवि प्राप्त करने के लिए (डेटा) चाहते छवि उरी, गुजर बिना

प्रारंभ कैमरा:

Intent it = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(it, CAMERA_RESULT); 

onActivityResult में के रूप में recive छवि:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (RESULT_OK == resultCode) { 
     // Get Extra from the intent 
     Bundle extras = data.getExtras(); 
     // Get the returned image from extra 
     Bitmap bmp = (Bitmap) extras.get("data"); 

     iv = (ImageView) findViewById(R.id.ReturnedImageView); 
     iv.setImageBitmap(bmp); 
    } 
} 


***** हैप्पी कोडिंग !!!! *****

+0

Thanx .... जो मेरे लिए काम करता है – hemu

+0

यह नेक्सस 7 – Ajay

+1

पर एक ज्ञात बग है यह सही जवाब है लेकिन क्या कोई मुझे बता सकता है कि डिवाइस समर्थन स्थान यूरी को कैसे जानना है या नहीं ?? –

4

कैमरा बटन पर ईवेंट पर क्लिक करें, आप इसे आजमा सकते हैं:

final Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(getTempFile(this))); 
     startActivityForResult(intent, TAKE_PHOTO_CODE); 

     declare TAKE_PHOTO_CODE globally as: 
     private static final int TAKE_PHOTO_CODE = 1; 

कोड में getTempFile फ़ंक्शन जोड़ें जो myImage.png नाम की छवि को सहेजने में मदद करेगा, आपने अपने ऐप के पैकेज नाम के नाम से फ़ोल्डर के तहत sdcard में क्लिक किया था।

private File getTempFile(Context context) { 
     final File path = new File(Environment.getExternalStorageDirectory(), 
       context.getPackageName()); 
     if (!path.exists()) { 
      path.mkdir(); 
     } 
     return new File(path, "myImage.png"); 
    } 

अब OnActivityResult समारोह पर इस जोड़ें:

if (requestCode == TAKE_PHOTO_CODE) { 
       final File file = getTempFile(this); 
       try { 
        Uri uri = Uri.fromFile(file); 
        Bitmap captureBmp = Media.getBitmap(getContentResolver(), 
          uri); 
        image.setImageBitmap(captureBmp); 
        } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 

मामले में आप मेमोरी मुद्दों से नीचे दिए गए कोड जोड़ें:

@Override 
    protected void onPause() { 
     image.setImageURI(null); 
     super.onPause(); 
    } 

मुझे आशा है कि यह तुम्हारी मदद करेगा

+0

यह काम कर रहा है ?? – AkashG

+0

हां थंक आप आकाशग – Mahalakshmi

2

मैं संदिग्ध 3 सकारात्मक समस्याओं ने आपकी समस्या बनाई हो सकती है:

  1. कुछ उपकरणों null लौटने जब आप onActivityResult विधि में extras.get("data"); फोन तो आपकी समस्या एक NullPointerException हो सकता है। इसे हल करने के लिए, आपको कैमरे ऐप को बताने के लिए सटीक URI स्थान पारित करने की आवश्यकता है जहां आप इसे स्टोर करना चाहते हैं और इसे onActivityResult में Bitmap के रूप में पुनर्प्राप्त करने के लिए उपयोग करें।

  2. कुछ अन्य डिवाइस onActivityResult में पूर्ण आकार Bitmap लौटाते हैं। यदि बिटमैप बहुत बड़ा है जिसके परिणामस्वरूप OutOfMemmoryError हो सकता है, तो हो सकता है कि आपको अपनी छवि को छोटे आकार में डीकोड करने की आवश्यकता हो ताकि बहुत यादगार ढेर न हो। यह दो लिंक इस स्थिति में आपकी मदद कर सकते हैं:

    http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

    BitmapFactory OOM driving me nuts

  3. हो सकता है कि अपनी गतिविधि GC द्वारा नष्ट हो जाता है तो आप अपने Activity के डेटा को बचाने के लिए onSavedInstanceState और onRestoreInstanceState उपयोग करना होगा। अधिक जानकारी के लिए this previous post का उत्तर देखें।

मुझे नहीं पता कि आपने पहले से ही इन मुद्दों का सामना किया है या नहीं।

आशा में मदद करता है :)

0

इस link पर दिए गए चरणों का पालन करें। उम्मीद है कि यह आपके लिए उपयोगी है।

या

क्रैशिंग के बिना अपनी छवि लाई जा रही है MainActivity में नीचे दिए गए कोड लिखें

// Storage for camera image URI components 
private final static String CAPTURED_PHOTO_PATH_KEY = "mCurrentPhotoPath";  
private final static String CAPTURED_PHOTO_URI_KEY = "mCapturedImageURI"; 

// Required for camera operations in order to save the image file on resume.  
private String mCurrentPhotoPath = null; 
private Uri mCapturedImageURI = null; 

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    if (mCurrentPhotoPath != null) {    
    savedInstanceState.putString(CAPTURED_PHOTO_PATH_KEY, mCurrentPhotoPath); 
    } 
    if (mCapturedImageURI != null) { 
    savedInstanceState.putString(CAPTURED_PHOTO_URI_KEY, mCapturedImageURI.toString()); 
    } 
    super.onSaveInstanceState(savedInstanceState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 

    if (savedInstanceState.containsKey(CAPTURED_PHOTO_PATH_KEY)) { 
     mCurrentPhotoPath = savedInstanceState.getString(CAPTURED_PHOTO_PATH_KEY); 
    } 
    if (savedInstanceState.containsKey(CAPTURED_PHOTO_URI_KEY)) { 
    mCapturedImageURI = Uri.parse(savedInstanceState.getString(CAPTURED_PHOTO_URI_KEY)); 
    } 
    super.onRestoreInstanceState(savedInstanceState); 
} 
0

नमस्ते सब मुझे पता है इस सवाल का जवाब दिया गया है, लेकिन इस रूप में भी में से एक है सबसे आसान समाधान समाधान मैंने कभी पाया है

यहां उदाहरण है जो स्वयं डिवाइस के बारे में परेशान है!

AndroidCameraUtils - प्रोजेक्ट डाउनलोड करें और लाइब्रेरी प्रोजेक्ट से नीचे इसे शामिल करके कोड स्निपेट का उपयोग कर सकते हैं!

निजी शून्य setupCameraIntentHelper() { mCameraIntentHelper = नए CameraIntentHelper (यह, नए CameraIntentHelperCallback() { @Override सार्वजनिक शून्य onPhotoUriFound (तिथि dateCameraIntentStarted, उरी photoUri इंट rotateXDegrees) { messageView.setText (GetString (नि। string.activity_camera_intent_photo_uri_found) + photoUri.toString());

 Bitmap photo = BitmapHelper.readBitmap(CameraIntentActivity.this, photoUri); 
     if (photo != null) { 
      photo = BitmapHelper.shrinkBitmap(photo, 300, rotateXDegrees); 
      ImageView imageView = (ImageView) findViewById(de.ecotastic.android.camerautil.sample.R.id.activity_camera_intent_image_view); 
      imageView.setImageBitmap(photo); 
     } 
    } 

    @Override 
    public void deletePhotoWithUri(Uri photoUri) { 
     BitmapHelper.deleteImageWithUriIfExists(photoUri, CameraIntentActivity.this); 
    } 

    @Override 
    public void onSdCardNotMounted() { 
     Toast.makeText(getApplicationContext(), getString(R.string.error_sd_card_not_mounted), Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onCanceled() { 
     Toast.makeText(getApplicationContext(), getString(R.string.warning_camera_intent_canceled), Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onCouldNotTakePhoto() { 
     Toast.makeText(getApplicationContext(), getString(R.string.error_could_not_take_photo), Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onPhotoUriNotFound() { 
     messageView.setText(getString(R.string.activity_camera_intent_photo_uri_not_found)); 
    } 

    @Override 
    public void logException(Exception e) { 
     Toast.makeText(getApplicationContext(), getString(R.string.error_sth_went_wrong), Toast.LENGTH_LONG).show(); 
     Log.d(getClass().getName(), e.getMessage()); 
    } 
}); 

}

@Override 
protected void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    mCameraIntentHelper.onSaveInstanceState(savedInstanceState); 
} 

@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    mCameraIntentHelper.onRestoreInstanceState(savedInstanceState); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    mCameraIntentHelper.onActivityResult(requestCode, resultCode, intent); 
} 
} 

नोट: - मैंने कैमरे के उपयोग के लिए कई उदाहरणों की कोशिश की और संभोग करने के लिए एक और तरीके हैं, लेकिन शुरुआती और व्यक्ति जो मुख्य अवधारणाओं के साथ बहुत अधिक परिवार नहीं हैं, इस परियोजना के साथ अधिक आराम करेंगे। धन्यवाद!