एंड्रॉइड कैमरा: डेटा इंट्रस्ट रिटर्न अशक्त


132

मेरे पास एक एंड्रॉइड एप्लिकेशन है जिसमें कई गतिविधियां हैं।

उनमें से एक में मैं एक बटन का उपयोग कर रहा हूं जो डिवाइस कैमरा को कॉल करेगा:

public void onClick(View view) {
    Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(photoIntent, IMAGE_CAPTURE);
}

उसी गतिविधि में मैं OnActivityResultछवि परिणाम के लिए विधि कहता हूं :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == IMAGE_CAPTURE) {
        if (resultCode == RESULT_OK) {
            Bitmap image = (Bitmap) data.getExtras().get("data");
            ImageView imageview = (ImageView) findViewById(R.id.pic);
            imageview.setImageBitmap(image);
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
        }
    }
}

समस्या यह है कि आशय dataअशक्त है और OnActivityResultविधि सीधे बदल जाती है (resultCode == RESULT_CANCELED)और एप्लिकेशन पिछले एवेटिविटी पर लौट आता है।

मैं इस समस्या को कैसे ठीक कर सकता हूं और कैमरा कॉल करने के बाद, एप्लिकेशन वर्तमान गतिविधि पर वापस लौटता है जिसमें एक ImageViewतस्वीर शामिल है जिसमें तस्वीर ली गई है?

धन्यवाद


इस जवाब पर एक नजर है stackoverflow.com/questions/18120775/...
प्रवीण शर्मा

जवाबों:


218

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

आप GitHub पर कैमरा ऐप के सोर्स कोड को देखकर इसे सत्यापित कर सकते हैं:

मुझे लगता है कि आप या तो EXTRA_OUTPUTकिसी भी तरह से गुजर रहे हैं , या आपके फोन पर कैमरा ऐप अलग तरह से काम करता है।


12
मैं अतिरिक्त कार्यशीलता को कैसे ठीक करूंगा, जो कैमरे पर गैर अशक्त इरादे देती है। प्रतीक
अब्दुल वहाब

वास्तव में उपयोगी उत्तर मैं चाहता हूं कि मैं इसे और अधिक कुशलता से खोजने के लिए दूसरों के लिए स्वीकार कर सकता हूं।
user1160020

1
बहुत बढ़िया ! स्पष्टीकरण के लिए बहुत बहुत धन्यवाद :) +100
मुहम्मद रियाज़

आपके द्वारा पोस्ट किया गया लिंक अब मान्य नहीं है।

4
क्या हम कैमरा क्लास को बदल सकते हैं और दोनों को अनुमति देने के लिए उस एक विधि को बदल सकते हैं, या क्या यह कठिन है?
टान्नर समर्स 19

16

मुझे एक आसान जवाब मिला। यह काम करता हैं!!

private void openCameraForResult(int requestCode){
    Intent photo = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    Uri uri  = Uri.parse("file:///sdcard/photo.jpg");
    photo.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(photo,requestCode);
}

if (requestCode == CAMERA_REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            File file = new File(Environment.getExternalStorageDirectory().getPath(), "photo.jpg");
            Uri uri = Uri.fromFile(file);
            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                bitmap = cropAndScale(bitmap, 300); // if you mind scaling
                profileImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

यदि आप इस छवि को क्रॉप और स्केल करना चाहते हैं

public static  Bitmap cropAndScale (Bitmap source, int scale){
    int factor = source.getHeight() <= source.getWidth() ? source.getHeight(): source.getWidth();
    int longer = source.getHeight() >= source.getWidth() ? source.getHeight(): source.getWidth();
    int x = source.getHeight() >= source.getWidth() ?0:(longer-factor)/2;
    int y = source.getHeight() <= source.getWidth() ?0:(longer-factor)/2;
    source = Bitmap.createBitmap(source, x, y, factor, factor);
    source = Bitmap.createScaledBitmap(source, scale, scale, false);
    return source;
}

4
यह FileUriExposedExceptionआधुनिक एसडीके संस्करणों पर देता है ।
सौरदीप नंदा

8

Ive ने इस समस्या का अनुभव किया था, intentयह शून्य नहीं है , लेकिन इसके माध्यम से भेजी गई जानकारी intentप्राप्त नहीं हुई हैonActionActivit()

यहाँ छवि विवरण दर्ज करें

यह getContentResolver () का उपयोग करके एक बेहतर समाधान है :

    private Uri imageUri;
    private ImageView myImageView;
    private Bitmap thumbnail;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

      ...
      ...    
      ...
      myImageview = (ImageView) findViewById(R.id.pic); 

      values = new ContentValues();
      values.put(MediaStore.Images.Media.TITLE, "MyPicture");
      values.put(MediaStore.Images.Media.DESCRIPTION, "Photo taken on " + System.currentTimeMillis());
      imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
      startActivityForResult(intent, PICTURE_RESULT);

  }

onActivityResult()द्वारा संग्रहीत एक बिटमैप मिल getContentResolver () :

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

        if (requestCode == REQUEST_CODE_TAKE_PHOTO && resultCode == RESULT_OK) {

            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imageUri);
                myImageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

परिचय के लिए विवरण परिचय के लिए विवरण

Github में मेरे उदाहरण की जाँच करें:

https://github.com/Jorgesys/TakePicture


6

सरल कार्य कैमरा ऐप अशक्त इरादे की समस्या से बचा रहा है

- इस उत्तर में शामिल सभी परिवर्तित कोड; Android ट्यूटोरियल के करीब

मैं इस मुद्दे पर बहुत समय बिता रहा हूं, इसलिए मैंने एक खाता बनाने और अपने परिणामों को आपके साथ साझा करने का निर्णय लिया है।

आधिकारिक एंड्रॉइड ट्यूटोरियल "टेकिंग फोटोज सिंपल" काफी वादे के अनुरूप नहीं निकला। प्रदान किया गया कोड मेरे डिवाइस पर काम नहीं करता था: एक सैमसंग गैलेक्सी एस 4 मिनी जीटी- I9195 एंड्रॉइड वर्जन 4.4.2 / किटकैट / एपीआई लेवल 19 चला रहा था।

मुझे पता चला कि तस्वीर को कैप्चर करते समय मुख्य समस्या निम्नलिखित विधि में थी ( dispatchTakePictureIntentट्यूटोरियल में):

takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);

इसका परिणाम यह हुआ कि बाद में यह onActivityResultशून्य हो गया।

इस समस्या को हल करने के लिए, मैंने यहाँ पहले के उत्तरों से बहुत प्रेरणा ली और जीथब पर कुछ सहायक पोस्ट (ज्यादातर डीपविनर द्वारा यह एक - उसके लिए बड़ा धन्यवाद; आप उसके उत्तर को निकट से संबंधित पोस्ट पर भी जांचना चाह सकते हैं )।

सलाह के इन सुखद टुकड़ों के बाद, मैंने उल्लिखित putExtraलाइन को हटाने और इसके बजाय onActivityResult () विधि के भीतर कैमरे से ली गई तस्वीर को वापस लाने की संबंधित चीज़ को करने की रणनीति को चुना । चित्र के साथ जुड़े बिटमैप को वापस पाने के लिए कोड की निर्णायक लाइनें हैं:

        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }

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

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.android.simpleworkingcameraapp.MainActivity">

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="takePicAndDisplayIt"
    android:text="Take a pic and display it." />

<ImageView
    android:id="@+id/image1"
    android:layout_width="match_parent"
    android:layout_height="200dp" />

</LinearLayout>

MainActivity.java:

package com.example.android.simpleworkingcameraapp;

import android.content.Intent;
import android.graphics.Bitmap;
import android.media.Image;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MainActivity extends AppCompatActivity {

private ImageView image;
static final int REQUEST_TAKE_PHOTO = 1;
String mCurrentPhotoPath;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    image = (ImageView) findViewById(R.id.image1);
}

// copied from the android development pages; just added a Toast to show the storage location
private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmm").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );

    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    Toast.makeText(this, mCurrentPhotoPath, Toast.LENGTH_LONG).show();
    return image;
}

public void takePicAndDisplayIt(View view) {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (intent.resolveActivity(getPackageManager()) != null) {
        File file = null;
        try {
            file = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
        }

        startActivityForResult(intent, REQUEST_TAKE_PHOTO);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultcode, Intent intent) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultcode == RESULT_OK) {
        Uri uri = intent.getData();
        Bitmap bitmap = null;
        try {
            bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);
        } catch (IOException e) {
            e.printStackTrace();
        }
        image.setImageBitmap(bitmap);
    }
}
}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.simpleworkingcameraapp">


<!--only added paragraph-->
<uses-feature
    android:name="android.hardware.camera"
    android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <!-- only crucial line to add; for me it still worked without the other lines in this paragraph -->
<uses-permission android:name="android.permission.CAMERA" />


<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

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

यह अतिरिक्त रूप से यह इंगित करने के लिए मूल्यवान हो सकता है कि एंड्रॉइड स्टूडियो के ऑटोइमपोर्ट को संभालने में सक्षम नहीं हो सकता है java.text.SimpleDateFormatऔर java.util.Date। मुझे उन दोनों को मैन्युअल रूप से आयात करना पड़ा।


इस समाधान के लिए STORAGE अनुमति की आवश्यकता होती है, जो बहुत अच्छा दृष्टिकोण नहीं है।
शनरिषन

4
यह प्रश्न स्पष्ट रूप से बताता है कि "डेटा" नाम का इंटेंट पैरामीटर onActivityResult () में पारित हुआ है, अशक्त है, जबकि आपका समाधान तब आगे बढ़ता है और इसका उपयोग करने का प्रयास करता है।
Maks

2

शायद इसलिए कि आपके पास ऐसा कुछ था?

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);                        
Uri fileUri =  CommonUtilities.getTBCameraOutputMediaFileUri();                  
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);                        
startActivityForResult(takePictureIntent, 2);

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

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, 2);

यही कारण है कि मेरे लिए क्या समस्या है, आशा है कि मदद की।


12
यह उत्तर भ्रामक है। MediaStore.EXTRA_OUTPUT डाले बिना आपको पूर्ण-आकार के फ़ोटो के बजाय एक थंबनेल मिलेगा। इसे डॉक्स और अन्य उत्तरों में हाइलाइट किया गया है।
user2417480

2
बिल्कुल यह जवाब भ्रामक है।
IndexOutOfDevelopersException

यह एक भ्रामक उत्तर है।
अब्दुल्ला थानसेह

0

निम्नलिखित कोड मेरे लिए काम करता है:

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

और यहाँ परिणाम है:

protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent)
{ 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    if(resultCode == RESULT_OK)
    {
        Uri selectedImage = imageReturnedIntent.getData();
        ImageView photo = (ImageView) findViewById(R.id.add_contact_label_photo);
        Bitmap mBitmap = null;
        try
        {
            mBitmap = Media.getBitmap(this.getContentResolver(), selectedImage);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}

मैंने इसका परीक्षण किया लेकिन यह एक ही मुद्दा है :(
soft_developer

1
मैं imageReturnedIntent.getData()मूल्य शून्य हो रही है । मैं आपकी तरह ही इरादे पैदा कर रहा हूं। कोई अतिरिक्त पैरामेट्स नहीं डाला।
जयदीप कलकानी

0

कैमरा एक्सेस करने के लिए और तस्वीरें लें और Android पर ImageView सेट करें

आपको Uri file = Uri.fromFile(getOutputMediaFile());मार्शमॉलो के लिए उपयोग करना होगा।

रास्ता पाने के लिए नीचे दिए गए लिंक का उपयोग करें

https://androidkennel.org/android-camera-access-tutorial/


0

कोटलिन कोड जो मेरे लिए काम करता है:

 private fun takePhotoFromCamera() {
          val intent = Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE)
        startActivityForResult(intent, PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA)
      }

और परिणाम प्राप्त करें:

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
 if (requestCode == PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA) {
         if (resultCode == Activity.RESULT_OK) {
           val photo: Bitmap? =  MediaStore.Images.Media.getBitmap(this.contentResolver, Uri.parse( data!!.dataString)   )
            // Do something here : set image to an ImageView or save it ..   
              imgV_pic.imageBitmap = photo 
        } else if (resultCode == Activity.RESULT_CANCELED) {
            Log.i(TAG, "Camera  , RESULT_CANCELED ")
        }

    }

}

और अनुरोध कोड घोषित करना न भूलें:

companion object {
 const val PERMISSIONS_REQUEST_TAKE_PICTURE_CAMERA = 300
  }

0

बहुत कोशिश और अध्ययन के बाद, मैं इसका पता लगाने में सक्षम था। सबसे पहले, इरादे से चर डेटा हमेशा शून्य हो जाएगा, इसलिए, !nullआपके ऐप को इतनी देर तक क्रैश करने की जाँच की जाएगी कि आप URI को startActivityForResult से गुजर रहे हैं। नीचे दिए गए उदाहरण को देखें। मैं कोटलिन का उपयोग करूंगा।

  1. कैमरा आशय खोलें

    fun addBathroomPhoto(){
    addbathroomphoto.setOnClickListener{
    
        request_capture_image=2
    
        var takePictureIntent:Intent?
        takePictureIntent =Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        if(takePictureIntent.resolveActivity(activity?.getPackageManager()) != null){
    
            val photoFile: File? = try {
                createImageFile()
            } catch (ex: IOException) {
                // Error occurred while creating the File
    
                null
            }
    
            if (photoFile != null) {
                val photoURI: Uri = FileProvider.getUriForFile(
                    activity!!,
                    "ogavenue.ng.hotelroomkeeping.fileprovider",photoFile)
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                    photoURI);
                startActivityForResult(takePictureIntent,
                    request_capture_image);
            }
    
    
        }
    
    }

    } `

  2. CreateImageFile () बनाएँ, लेकिन आप चित्र को बनाने के लिए आवश्यक हैवेपाट चर वैश्विक। इसे कैसे बनाया जाए, इसका उदाहरण एंड्रॉइड के आधिकारिक दस्तावेज़ और बहुत सरल है

  3. आशय प्राप्त करें

     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    
    if (requestCode == 1 && resultCode == RESULT_OK) {
        add_room_photo_txt.text=""
        var myBitmap=BitmapFactory.decodeFile(imageFilePath)
        addroomphoto.setImageBitmap(myBitmap)
        var file=File(imageFilePath)
        var fis=FileInputStream(file)
        var bm = BitmapFactory.decodeStream(fis);
        roomphoto=getBytesFromBitmap(bm) }}
  4. GetBytesFromBitmap विधि

      fun getBytesFromBitmap(bitmap:Bitmap):ByteArray{
    
      var stream=ByteArrayOutputStream()
      bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
      return stream.toByteArray();
      }

आशा है कि ये आपकी मदद करेगा।


0

जब हम Android में Camera से Image को कैप्चर करेंगे तब Uri या data.getdata()null आएगा। इस समस्या को हल करने के लिए हमारे पास दो समाधान हैं।

  1. हम बिटमैप छवि से उरी मार्ग प्राप्त कर सकते हैं
  2. हम कर्सर से उरी मार्ग प्राप्त कर सकते हैं।

मैं यहां सभी तरीकों को लागू करूंगा, कृपया इन्हें ध्यान से देखें और पढ़ें: -

पहले मैं बताउंगा कि बिटमैप इमेज से उरई कैसे प्राप्त करें: पूरा कोड है:

पहले हम इंटेंट के माध्यम से छवि को कैप्चर करेंगे जो दोनों विधियों के लिए समान होगा इसलिए यह कोड मैं केवल एक बार यहां लिखूंगा:

// Capture Image
captureImg.setOnClickListener(new View.OnClickListener(){
    @Override public void onClick(View view){
        Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if(intent.resolveActivity(getPackageManager())!=null){
            startActivityForResult(intent,reqcode);
        }

    }
});  

अब हम OnActivityResult को लागू करेंगे :-( यह 2 विधियों के ऊपर दोनों के लिए समान होगा): -

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

    if (requestCode == reqcode && resultCode == RESULT_OK)
    {

        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ImageView.setImageBitmap(photo);

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        //Show Uri path based on Image
        Toast.makeText(LiveImage.this, "Here " + tempUri, Toast.LENGTH_LONG).show();

        //Show Uri path based on Cursor Content Resolver
        Toast.makeText(this, "Real path for URI : " + getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
}     

अब हम कक्षाओं के माध्यम से छवि और कर्सर विधियों से उरी बनाने के लिए उपरोक्त सभी विधि बनाएंगे:

अब बिटमैप इमेज से URI पथ

private Uri getImageUri(Context applicationContext, Bitmap photo)
{
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
}

सहेजी गई छवि के वास्तविक पथ से \ Uri

public String getRealPathFromURI(Uri uri)
{
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

-1

जब हम Android में Camera से इमेज कैप्चर करते हैं तब Uriया data.getdata()शून्य हो जाता है। इस समस्या को हल करने के लिए हमारे पास दो समाधान हैं।

  1. बिटमैप छवि से उरी पथ को पुनः प्राप्त करें
  2. कर्सर से उरी मार्ग को पुनः प्राप्त करें।

इस तरह से बिटमैप छवि से उरी को पुनः प्राप्त करना है। इंटेंट के माध्यम से पहली कैप्चर इमेज जो दोनों विधियों के लिए समान होगी:

// Capture Image
captureImg.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivityForResult(intent, reqcode);
        }
    }
});

अब लागू करें OnActivityResult, जो दोनों विधियों के लिए समान होगा:

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

    if(requestCode==reqcode && resultCode==RESULT_OK)
    {
        Bitmap photo = (Bitmap) data.getExtras().get("data");
        ImageView.setImageBitmap(photo);

        // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
        Uri tempUri = getImageUri(getApplicationContext(), photo);

        // Show Uri path based on Image
        Toast.makeText(LiveImage.this,"Here "+ tempUri, Toast.LENGTH_LONG).show();

        // Show Uri path based on Cursor Content Resolver
        Toast.makeText(this, "Real path for URI : "+getRealPathFromURI(tempUri), Toast.LENGTH_SHORT).show();
    }
    else
    {
        Toast.makeText(this, "Failed To Capture Image", Toast.LENGTH_SHORT).show();
    }
}

अब छवि और कर्सर विधियों से उरी बनाने के लिए सभी उपरोक्त तरीके बनाएं:

बिटमैप छवि से उरी पथ:

private Uri getImageUri(Context applicationContext, Bitmap photo) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    photo.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = MediaStore.Images.Media.insertImage(LiveImage.this.getContentResolver(), photo, "Title", null);
    return Uri.parse(path);
}

बचाई गई छवि के असली रास्ते से उरी:

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null);
    cursor.moveToFirst();
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
    return cursor.getString(idx);
}

क्या कोई इसका समाधान कर पाया है? कृपया अपना समाधान पोस्ट करें। एंड्रॉइड
डॉक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.