2011-11-22 11 views
5

मैं एक तस्वीर लेने के लिए कैमरा कॉल करता हूं। लेकिन तस्वीर लेने के बाद मैं अपनी मूल गतिविधि पर वापस नहीं जा सकता। समस्या क्या है? धन्यवाद।कॉलिंग इरादे से वापस कैसे जाएं

public void addEntry(View view) 
{ 
       String EntryName=RegisterName.toString(); 
       Toast.makeText(this, EntryName, Toast.LENGTH_LONG); 
       Intent addEntryintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File file = new File(getFilesDir(),EntryName); 
       registeryFileUri = Uri.fromFile(file); 
       addEntryintent.putExtra(MediaStore.EXTRA_OUTPUT, registeryFileUri); 
       startActivityForResult(addEntryintent,TAKE_PICTURE);   

} 


@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == TAKE_PICTURE) 
     { 
      if (data != null) 
      { 
     Toast.makeText(this, "Successfully Registered!", Toast.LENGTH_LONG); 
     ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture); 
     Registerimage.setImageURI(registeryFileUri); 
     } 

    } 
    } 
+0

आप 'toast.show(); 'at' atctivityResult()' को कॉल करना भूल गए। यह 'टोस्ट.मेकटेक्स्ट होना चाहिए (यह," सफलतापूर्वक पंजीकृत! ", टोस्ट.LENGTH_LONG) .show();' –

उत्तर

4

उत्तर

उपयोग appContext.getExternalCacheDir() और भूल नहीं है अनुमतियां उल्लेख करने के लिए।

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
       if (requestCode == TAKE_PICTURE) 
       { 
         if(resultCode==Activity.RESULT_OK) 
        { //if (data != null) 
        //{ 
        Toast.makeText(this, "Successfully Registered!", Toast.LENGTH_LONG); 
        ImageView Registerimage= (ImageView)findViewById(R.id.RegisterPicture); 
        Registerimage.setImageURI(registeryFileUri); 
        //} 
         } 
         else 
         Toast.makeText(this, "Not Registered!", Toast.LENGTH_LONG); 
      } 
**"android.permission.CAMERA"**  

Check whether the above permission is specified in your manifest or not 

Note: It's better to use getExternalCacheDir() than getFilesDir() if you still dont get the 
     image then use that. Dont forgot to specify the permission "android.permission.WRITE_EXTERNAL_STORAGE" if you use the getExternalCacheDir(). 
+0

आप 'टोस्ट.शो();' 'atActivityResult() के अंदर '' –

+0

या 'कॉल करना भूल गए हैं, आप सही हैं। लेकिन समस्या इरादे से है इसलिए मैंने शेष कोड सत्यापित नहीं किया है। –

+0

न तो काम करता है। मैं 4.0 का उपयोग कर रहा हूं, अभी भी कैमरा गतिविधि से वापस नहीं आ सकता। – James

1

कुछ उपकरणों data पर दुर्भाग्य से कैमरा गतिविधि बुला के बाद onActivityResult में अशक्त हो जाएगा। इसलिए आपको अपनी स्थिति को अपनी गतिविधि के चर में सहेजने की आवश्यकता हो सकती है, और उन्हें onActivityResult में पढ़ा जा सकता है। इन चरों को onSaveInstanceState में सहेजना सुनिश्चित करें और उन्हें onCreate में पुनर्स्थापित करें।

+1

भले ही "डेटा! = नल" जोड़ा नहीं गया है, फिर भी मैं कैमरा गतिविधि में फंस गया हूं ... – James

7

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

कैमरे की गतिविधि वापस नहीं लौटने के कई कारण हैं। दो प्रमुख इस प्रकार हैं: नई तस्वीर के लिए

  1. पथ अमान्य, या गैर-मौजूद है, या यह

  2. आवेदन को निलंबित कर दिया और बच गया पथ खो जाना नहीं बनाया जा सकता।

तो यहां मेरा कोड इन सभी समस्याओं को हल करने के लिए है, सभी एक साथ काम कर रहे हैं।

class ImageServices { 

    private static String getTempDirectoryPath(Context ctx) { 
    File cache; 

    // SD Card Mounted 
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { 
     cache = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + 
       "/Android/data/" + ctx.getPackageName() + "/cache/"); 
    } 
    // Use internal storage 
    else { 
     cache = ctx.getCacheDir(); 
    } 

    // Create the cache directory if it doesn't exist 
    if (!cache.exists()) { 
     cache.mkdirs(); 
    } 

    return cache.getAbsolutePath(); 
    } 

    public static Uri getOutputImageFileUri(Context ctx) { 
    // TODO: check the presence of SDCard 

    String tstamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File file = new File(getTempDirectoryPath(ctx), "IMG_" + tstamp + ".jpg"); 

    return Uri.fromFile(file); 

    } 
} 

कोड आंशिक रूप से developer.android.com द्वारा और Apache Cordova परियोजना के CameraLauncher class द्वारा आंशिक रूप से प्रेरित है:

सबसे पहले मैं सहायक वर्ग ImageServices बनाया।

मेरी गतिविधि में बटन एक तस्वीर लेने के लिए ईवेंट हैंडलर इस तरह दिखता है: के रूप में imageFileUri पहले से ही विद्यमान फ़ाइल को इंगित करता है और आवश्यक प्रतिपादन onResume में किया जाता है

private Uri imageFileUri; 

private static final int MAKE_PHOTO_RESULT_CODE = 100; 
private static final int PICK_PHOTO_RESULT_CODE = 101; 

public void onMakePhoto(View v) { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    imageFileUri = ImageServices.getOutputImageFileUri(this); 
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFileUri); 
    Log.i("babies", "Taking picture: requested " + imageFileUri); 
    startActivityForResult(intent, MAKE_PHOTO_RESULT_CODE); 
} 

विधि onActivityResult वास्तव में नहीं है, ज्यादा होते हैं विधि है, जो जब गतिविधि अग्रभूमि में वापस हो जाता है कहा जाता है:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (resultCode == RESULT_OK) { 
    switch(requestCode) { 
     case MAKE_PHOTO_RESULT_CODE: 
     assert imageFileUri != null; 
     break; 
     case ... 
     ...other cases... 
     break; 
    } 
    } 
} 

लेकिन यह अभी भी पर्याप्त नहीं के रूप में imageFileUri अपने ऐप को निलंबित होने पर खो जाए है। और नियमित डिवाइस पर संभावनाएं 100% के करीब होती हैं।तो अगली आप उदाहरण के राज्य के लिए imageFileUri का मान संग्रहीत करना:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    if (imageFileUri == null) { 
    outState.putString("file-uri", ""); 
    } 
    else { 
    outState.putString("file-uri", imageFileUri.toString()); 
    } 
}; 

और में फिर से लोड - सबसे आसान सीधे onCreate में है: तो, फिर से,

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    if (savedInstanceState != null) { 
    String fileUri = savedInstanceState.getString("file-uri"); 
    if (!fileUri.equals("")) imageFileUri = Uri.parse(fileUri); 
    } 
} 

कई अन्य समाधान के शीर्ष पर

  1. होशियार getTempDirectoryPath Apache Cordova
  2. से प्रेरित: इस साइट पर और साथ ही कहीं और प्रस्तुत किया, इसकी दो प्रमुख मतभेद हैं

और अब निलंबित आवेदन जीवित रहने के लिए अनुमति देता है imageFileUri - कम से कम मेरे लिए - सब कुछ ठीक काम करता है।

+0

मैं पूरे दिन अपने बालों को खींच रहा हूं। अंत में यह समाधान मिला। संभावना नहीं है कि आप यह टिप्पणी देखेंगे, लेकिन यदि आप करते हैं, तो क्या आपको कोई डिवाइस मिला है जो यह काम नहीं करता है? ग्रेट स्टफ @ टॉम बर्गर –

+0

ऐप अभी तक उत्पादन में नहीं है, इसलिए मेरे पास इसका परीक्षण करने के लिए बहुत अधिक डिवाइस नहीं हैं। लेकिन अगर आपको डिवाइस का सामना करना पड़ता है, जहां ऊपर की बात समस्या हो सकती है, तो मुझे निश्चित रूप से पता चलेगा :-) –

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