android - मेरे ऐप के लिए गैलरी(एसडी कार्ड) से एक छवि कैसे चुनें?




android-image android-gallery (7)

यह सवाल मूल रूप से एंड्रॉइड 1.6 के लिए पूछा गया था।

मैं अपने ऐप में फोटो विकल्पों पर काम कर रहा हूं।

मेरे पास एक गतिविधि है और मेरी गतिविधि में एक छवि दृश्य है। जब मैं बटन पर क्लिक करता हूं तो यह गैलरी पर रीडायरेक्ट करेगा और मैं एक छवि का चयन करने में सक्षम होगा। चयनित छवि मेरे ImageView में दिखाई देगी।


अद्यतन उत्तर, लगभग 5 साल बाद:

मूल उत्तर में कोड अब विश्वसनीय रूप से काम नहीं करता है, क्योंकि विभिन्न स्रोतों की छवियां कभी-कभी एक अलग सामग्री यूआरआई के साथ वापस आती हैं, यानी content:// file:// बजाय file:// । एक बेहतर समाधान केवल context.getContentResolver().openInputStream(intent.getData()) , क्योंकि यह आपके द्वारा चुने गए इनपुट इनपुट को वापस कर देगा।

उदाहरण के लिए, BitmapFactory.decodeStream() इस स्थिति में पूरी तरह से काम करता है, क्योंकि आप तब भी बड़ी छवियों को कम करने और स्मृति समस्याओं से बचने के लिए विकल्प और inSampleSize फ़ील्ड का उपयोग कर सकते हैं।

हालांकि, Google ड्राइव जैसी चीजें उन छवियों को यूआरआई लौटाती हैं जिन्हें वास्तव में अभी तक डाउनलोड नहीं किया गया है। इसलिए आपको पृष्ठभूमि थ्रेड पर getContentResolver () कोड निष्पादित करने की आवश्यकता है।

मूल उत्तर:

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

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

    switch(requestCode) { 
    case REQ_CODE_PICK_IMAGE:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            String[] filePathColumn = {MediaStore.Images.Media.DATA};

            Cursor cursor = getContentResolver().query(
                               selectedImage, filePathColumn, null, null, null);
            cursor.moveToFirst();

            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String filePath = cursor.getString(columnIndex);
            cursor.close();


            Bitmap yourSelectedImage = BitmapFactory.decodeFile(filePath);
        }
    }
}

इसके बाद, आपको जो भी आप चाहते हैं उसे करने के लिए "चयनित चयन छवि" में संग्रहीत चयनित छवि मिल गई है। यह कोड ContentResolver डेटाबेस में छवि का स्थान प्राप्त करके काम करता है, लेकिन यह स्वयं पर्याप्त नहीं है। प्रत्येक छवि में जानकारी के बारे में 18 कॉलम होते हैं, जिसमें फ़ाइलपैथ से 'आखिरी संशोधित तिथि' तक जीपीएस निर्देशांक में फोटो ले लिया गया था, हालांकि कई फ़ील्ड वास्तव में उपयोग नहीं किए जाते हैं।

समय बचाने के लिए क्योंकि आपको वास्तव में अन्य फ़ील्ड की आवश्यकता नहीं है, कर्सर खोज फ़िल्टर के साथ की जाती है। फ़िल्टर आपके इच्छित कॉलम का नाम निर्दिष्ट करके काम करता है, MediaStore.Images.Media.DATA, जो पथ है, और फिर उस स्ट्रिंग को [] कर्सर क्वेरी में दे रहा है। कर्सर क्वेरी पथ के साथ वापस आती है, लेकिन आप नहीं जानते कि जब तक आप कॉलम columnIndex कोड का उपयोग नहीं करते हैं तब तक यह कौन सा कॉलम है। यह बस इसके नाम के आधार पर कॉलम की संख्या प्राप्त करता है, वही फ़िल्टरिंग प्रक्रिया में उपयोग किया जाता है। एक बार जब आप इसे प्राप्त कर लेंगे, तो आप अंत में दिए गए कोड की अंतिम पंक्ति के साथ छवि को बिटमैप में डीकोड करने में सक्षम हैं।


कुछ कारणों से, इस धागे में सभी उत्तरों, onActivityResult() में प्राप्त Uri को पोस्ट-प्रोसेस करने का प्रयास करें, जैसे कि छवि का असली पथ प्राप्त करना और फिर Bitmap प्राप्त करने के लिए BitmapFactory.decodeFile(path) का उपयोग करें।

यह कदम अनावश्यक है। ImageView क्लास में setImageURI(uri) नामक एक विधि है। अपने यूरी को पास करें और आपको किया जाना चाहिए।

Uri imageUri = data.getData();
imageView.setImageURI(imageUri);

एक पूर्ण कार्य उदाहरण के लिए आप यहां एक नज़र डाल सकते हैं: http://androidbitmaps.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

पुनश्च:
Bitmap को एक अलग चर में प्राप्त करना उन मामलों में समझ में आएगा जहां छवि लोड की जा सकती है, स्मृति में फिट होने के लिए बहुत बड़ा है, और @Oiamii उत्तर में दिखाए गए जैसे OurOfMemoryError को रोकने के लिए एक स्केल डाउन ऑपरेशन आवश्यक है।


गैलरी लॉन्च करने के लिए ऐसा करें और उपयोगकर्ता को एक छवि लेने की अनुमति दें:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, IMAGE_PICK);

फिर आपके onActivityResult() में छवि के यूआरआई का उपयोग करें जो छवि को आपके ImageView पर सेट करने के लिए वापस कर दिया गया है।


परिणामस्वरूप आपको गैलरी के इरादे को शुरू करना होगा।

Intent i = new Intent(Intent.ACTION_PICK,
               android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, ACTIVITY_SELECT_IMAGE); 

फिर onActivityForResult , छवि की उरी प्राप्त करने के लिए intent.getData() पर कॉल करें। फिर आपको सामग्री प्रदाता से छवि प्राप्त करने की आवश्यकता है।


#initialize in main activity 
    path = Environment.getExternalStorageDirectory()
            + "/images/make_machine_example.jpg"; #
     ImageView image=(ImageView)findViewById(R.id.image);
 //--------------------------------------------------||

 public void FromCamera(View) {

    Log.i("camera", "startCameraActivity()");
    File file = new File(path);
    Uri outputFileUri = Uri.fromFile(file);
    Intent intent = new Intent(
            android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
    startActivityForResult(intent, 1);

}

public void FromCard() {
    Intent i = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(i, 2);
}

 protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == 2 && resultCode == RESULT_OK
            && null != data) {

        Uri selectedImage = data.getData();
        String[] filePathColumn = { MediaStore.Images.Media.DATA };

        Cursor cursor = getContentResolver().query(selectedImage,
                filePathColumn, null, null, null);
        cursor.moveToFirst();

        int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
        String picturePath = cursor.getString(columnIndex);
        cursor.close();

        bitmap = BitmapFactory.decodeFile(picturePath);
        image.setImageBitmap(bitmap);

        if (bitmap != null) {
            ImageView rotate = (ImageView) findViewById(R.id.rotate);

        }

    } else {

        Log.i("SonaSys", "resultCode: " + resultCode);
        switch (resultCode) {
        case 0:
            Log.i("SonaSys", "User cancelled");
            break;
        case -1:
            onPhotoTaken();
            break;

        }

    }

}

protected void onPhotoTaken() {
    // Log message
    Log.i("SonaSys", "onPhotoTaken");
    taken = true;
    imgCapFlag = true;
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize = 4;
    bitmap = BitmapFactory.decodeFile(path, options);
    image.setImageBitmap(bitmap);


}

private static final int SELECT_PHOTO = 100;

इरादा शुरू करो

Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, SELECT_PHOTO);    

प्रक्रिया परिणाम

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

    switch(requestCode) { 
    case SELECT_PHOTO:
        if(resultCode == RESULT_OK){  
            Uri selectedImage = imageReturnedIntent.getData();
            InputStream imageStream = getContentResolver().openInputStream(selectedImage);
            Bitmap yourSelectedImage = BitmapFactory.decodeStream(imageStream);
        }
    }
}

वैकल्पिक रूप से, आप OutOfMemory त्रुटियों से बचने के लिए अपनी छवि को भी कम कर सकते हैं।

private Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {

        // Decode image size
        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o);

        // The new size we want to scale to
        final int REQUIRED_SIZE = 140;

        // Find the correct scale value. It should be the power of 2.
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) {
            if (width_tmp / 2 < REQUIRED_SIZE
               || height_tmp / 2 < REQUIRED_SIZE) {
                break;
            }
            width_tmp /= 2;
            height_tmp /= 2;
            scale *= 2;
        }

        // Decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        o2.inSampleSize = scale;
        return BitmapFactory.decodeStream(getContentResolver().openInputStream(selectedImage), null, o2);

    }

public class EMView extends Activity {
ImageView img,img1;
int column_index;
  Intent intent=null;
// Declare our Views, so we can access them later
String logo,imagePath,Logo;
Cursor cursor;
//YOU CAN EDIT THIS TO WHATEVER YOU WANT
private static final int SELECT_PICTURE = 1;

 String selectedImagePath;
//ADDED
 String filemanagerstring;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    img= (ImageView)findViewById(R.id.gimg1);



    ((Button) findViewById(R.id.Button01))
    .setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {

            // in onCreate or any event where your want the user to
            // select a file
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,
                    "Select Picture"), SELECT_PICTURE);


        }
    });
}

//UPDATED
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();

            //OI FILE Manager
            filemanagerstring = selectedImageUri.getPath();

            //MEDIA GALLERY
            selectedImagePath = getPath(selectedImageUri);


            img.setImageURI(selectedImageUri);

           imagePath.getBytes();
           TextView txt = (TextView)findViewById(R.id.title);
           txt.setText(imagePath.toString());


           Bitmap bm = BitmapFactory.decodeFile(imagePath);

          // img1.setImageBitmap(bm);



        }

    }

}

//UPDATED!
public String getPath(Uri uri) {
String[] projection = { MediaColumns.DATA };
Cursor cursor = managedQuery(uri, projection, null, null, null);
column_index = cursor
        .getColumnIndexOrThrow(MediaColumns.DATA);
cursor.moveToFirst();
 imagePath = cursor.getString(column_index);

return cursor.getString(column_index);
}

}




android-gallery