12

के बाद नहीं बुलाया जाता है, मैं एक छवि संपादन एंड्रॉइड एप्लिकेशन पर काम कर रहा हूं। मेरी गतिविधियों में से एक में मैं इस तरह onCreate में गैलरी से एक छवि लेने के लिए कोई लक्ष्य फोन:OnActivityResult को कभी-कभी ACTION_GET_CONTENT इरादे

Intent intent = new Intent(); 
intent.setType("image/*"); 
intent.setAction(Intent.ACTION_GET_CONTENT); 
startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE); 

तो मैं इस तरह डेटा प्राप्त:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Crashlytics.log("onActivityResult called"); 
    super.onActivityResult(requestCode, resultCode, data); 

    if (requestCode == PICK_IMAGE && resultCode == Activity.RESULT_OK && data != null) { 
     Crashlytics.log("Data received from image pick intent"); 
     imageUri = data.getData(); 
     loadImage(); 
    } else { 
     //if we do not select a picture, go back to the dashboard 
     Crashlytics.log("Data not received"); 
     onBackPressed(); 
     Log.d(TAG, "no picture selected"); 
    } 
} 

loadImage विधि:

private void loadImage() { 
    try { 
     photoBitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri); 
    } catch (IOException e) { 
     Crashlytics.log("IOException from getBitmap"); 
     Log.d(TAG, e.getMessage()); 
     showToastAndPressBack(); 
     return; 
    } 

    if (photoBitmap == null) { 
     Crashlytics.log("photoBitmap is null in onActivityResult"); 
     showToastAndPressBack(); 
     return; 
    } 

    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    imgVWidth = size.x; 
    int height = size.y; 
    imgVHeight = (int) (((float) imgVWidth/photoBitmap.getWidth()) * photoBitmap.getHeight()); 
    photoInImgViewBitmap = Bitmap.createScaledBitmap(photoBitmap, imgVWidth, imgVHeight, true); 
    imageAlreadyPicked = true; 
} 

अब मेरी समस्या यह है कि कभी-कभी मैं क्रैशलिटिक्स में एनपीई-एस देखता हूं कि फोटोबिटमैप शून्य है जब उपयोगकर्ता अगले बटन दबाता है।

@OnClick(R.id.toolbar_next) 
void onToolbarNextClick() { 
    float originalScale = (float) (previewImageView.getHeight())/(float) (photoBitmap.getHeight()); 
    ... 
} 

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

प्रश्न: onActivityResult क्यों कभी-कभी कहा जाता है, और कभी-कभी नहीं? क्या photoBitmap के किसी भी अन्य संभावित कारण हैं?

+0

अपवाद तब होता है जब उपयोगकर्ता इस स्क्रीन से अगले स्थान पर जाता है। यदि यह बिटमैप लोडिंग के कारण था, तो हम उस परमाणुता के बारे में पता लगाएंगे जैसा कि आप कोड नमूना में देख सकते हैं। – WPMed

+0

हां मैं इसे ओवरराइड कर रहा हूं- – WPMed

+0

यदि यह काम नहीं कर रहा है, तो बैकप्रेस दबाए जाने पर, मैं क्रैशलीटिक्स लॉग देखता हूं कि एक्टिविटी रिसेट को – WPMed

उत्तर

-1

कैमरा गतिविधि उपयोग इस कोड

Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST); 

बिटमैप प्राप्त करने के लिए शुरू करने के लिए

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode == Activity.RESULT_OK){ 
     if(requestCode==CAMERA_REQUEST) { 
      Bitmap photo = (Bitmap) data.getExtras().get("data"); } 
     }else{ 
      //Camera request cancelled} 
     } 
+0

पूरी तरह से काम किया;) –

-1

यह काम इस प्रयास करें सही

 Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      startActivityForResult(i, LOAD_IMAGE_RESULTS); 

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

      if (requestCode == LOAD_IMAGE_RESULTS && resultCode == RESULT_OK && data != null) { 
        // Let's read picked image data - its URI 
        Uri pickedImage = data.getData(); 

        // Let's read picked image path using content resolver 
        String[] filePath = {MediaStore.Images.Media.DATA}; 
        @SuppressLint("Recycle") Cursor cursor = null; 
        if (pickedImage != null) { 
         cursor = getContentResolver().query(pickedImage, filePath, null, null, null); 
        } 
        if (cursor != null) { 
         cursor.moveToFirst(); 

         String imagePath = cursor.getString(cursor.getColumnIndex(filePath[0])); 
     } 
    } 
} 
अब

आप बिटमैप imagepath में बदल सकते हैं

+0

@SupressLint ("रीसायकल") का उद्देश्य क्या है? – WPMed

-2

अपने कोड के आखिरी पंक्ति के बाद super.onActivityResult पर कॉल करें। जब आप सुपर को कॉल करते हैं तो आपने एंड्रॉइड को बताया है।

इसके अलावा मैंने आपके चारों ओर एक चार अनुक्रम लॉगिंग देखा। ऐसा न करें कि आप इसके साथ कुछ भी ठीक नहीं करेंगे।

Crashlytics.log("Data not received"); 

आपको कुछ डेटा सहेजने की आवश्यकता है। माना जाता है कि उपयोगकर्ता रद्द कर दिया गया है क्योंकि आपका कोड इसे कैप्चर नहीं करता है।

/* लोग इन विधि मान गया है किसी पूर्णांक इनपुट */

Crashlytics.log("Data not received"); 
Crashlytics.log(requestCode); 
Crashlytics.log(resultCode); 
+0

मैं उस लॉग के साथ * किसी भी * को ठीक करना नहीं चाहता हूं। बस यह पता लगाना चाहता था कि कौन सा कोड निष्पादित करता है। यदि आप इस प्रश्न को पढ़ते हैं जो मैंने देखा है कि मैंने लिखा है: "केवल क्रैशलिटिक्स लॉग मैं देखता हूं कि उपयोगकर्ता इरादे के लिए छोड़ देता है (मैंने क्रैशलिटिक्स लॉग को अंदर रोक दिया है)। परमाणुता के लिए कोई लॉग नहीं है" आप देखते हैं? एक भी लॉग नहीं है जो इंगित करेगा कि एक्टिविटी रिसेट को बुलाया गया था। – WPMed

+0

हां मैंने सवाल पढ़ा था। जब आपने इरादा शुरू किया था तब आपने लॉग इन नहीं किया था। मेरा मानना ​​है कि इरादा खत्म होने के बारे में जानने के लिए एक चार अनुक्रम पर्याप्त है। – danny117

+0

मैंने लॉग इन किया है। इरादे को बुलाया गया था या नहीं, यह जानने का कोई और तरीका नहीं मिला। तो कपड़े ने केवल एक लॉग की सूचना दी: "उपयोगकर्ता बाएं स्क्रीन" (जिसे मैं रोकता हूं)। और उसके बाद उपयोगकर्ता एक नल फोटोबिटमैप के साथ आगे दबाता है और ऐप दुर्घटनाग्रस्त हो जाता है। कोई एक्टिविटी रिसर्च लॉग नहीं। – WPMed

-1

उपयोग इस गैलरी से चयन करने के लिए:

Intent i = new Intent(Intent.ACTION_PICK); 
i.setType("image/*"); 
startActivityForResult(i, REQUEST_CODE); 

अब यू onActivityResult में एक कॉलबैक मिल जाएगा:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
     case REQUEST_CODE: 
      if (resultCode != RESULT_CANCELED) { 
//use data to get the selected image 
      } 
      break; 
    } 
} 
+0

@WPMed क्या आपने यह कोशिश की है? – anujtayal

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