गैलरी गैलरी से चित्र चुनें


197

मैं गैलरी से एक चित्र चयनकर्ता बनाना चाहता हूं। मैं कोड का उपयोग करता हूं

 intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
 startActivityForResult(intent, TFRequestCodes.GALLERY);

मेरी समस्या यह है कि इस गतिविधि में और वीडियो फ़ाइलों को प्रदर्शित किया जाता है। क्या प्रदर्शित फ़ाइलों को फ़िल्टर करने का एक तरीका है ताकि इस गतिविधि में कोई वीडियो फ़ाइल प्रदर्शित न हो?


3
यह आलेख अच्छी तरह से वर्णन करता है कि गैलरी से चित्र कैसे चुनें: androidbitmaps.blogspot.com/2015/04/…
एंडी रेस

आपके जैसा ही एक सवाल है। stackoverflow.com/a/31382240/1835650
TeeTracker

जवाबों:


347

पूर्ण रूप से। इसे इस्तेमाल करे:

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

निरंतर PICK_IMAGE बनाने के लिए भी मत भूलना , ताकि उपयोगकर्ता छवि गैलरी गतिविधि से वापस आने पर पहचान सकें:

public static final int PICK_IMAGE = 1;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if (requestCode == PICK_IMAGE) {
        //TODO: action
    }
}

इस तरह से मैं इमेज गैलरी कहता हूं। इसे डालें और देखें कि क्या यह आपके लिए काम करता है।

संपादित करें:

यह दस्तावेज़ एप्लिकेशन लाता है। उपयोगकर्ता को अपने द्वारा इंस्टॉल किए गए किसी भी गैलरी एप्लिकेशन का उपयोग करने की अनुमति देने के लिए:

    Intent getIntent = new Intent(Intent.ACTION_GET_CONTENT);
    getIntent.setType("image/*");

    Intent pickIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    pickIntent.setType("image/*");

    Intent chooserIntent = Intent.createChooser(getIntent, "Select Image");
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, new Intent[] {pickIntent});

    startActivityForResult(chooserIntent, PICK_IMAGE);

6
मुझे इस "एंड्रॉइड सिस्टम", "दस्तावेज़" पर 2 विकल्प मिलते हैं। अगर मैं एंड्रॉइड सिस्टम का चयन करता हूं, तो यह मुझे गैलरी और फोटो के साथ प्रस्तुत करता है। मैं इस मध्यवर्ती विकल्प सूची से कैसे छुटकारा पाऊँ?
उदय

4
@ यह केवल इसलिए है क्योंकि आपने डिफ़ॉल्ट सेट नहीं किया है। बस इसे छोड़ दो :)
ट्रिस्टन विली

13
PICK_IMAGE स्थिरांक को किस पर सेट करना है? यह कहता है "प्रतीक को" PICK_IMAGE "हल नहीं कर सकता
माइकल

3
@Michael PICK_IMAGE निरंतर इस वर्ग पर आपके द्वारा निर्धारित किसी भी स्थिर अंतर मान को रखता है , इसे आगे @Overrideफ़ंक्शन पर उपयोग किया जाता है onActivityResult(int requestCode, resultCode, Intent data), जहां यह अनुशंसा की जाती है कि आप requestCodeकिसी भी कार्रवाई करने से पहले पैरामीटर की जांच करने के लिए इस निरंतर का उपयोग करें :)
गेब्रियल चेचेक विटाली

आप निम्न कोड के साथ onActivityResult (...) विधि से बिटमैप को प्राप्त कर सकते हैं (RESULT_OK मानकर): बिटमैप बिटमैप = data.getExtras ()। GetParcelable ("डेटा");
Shn_Android_Dev 21

197

कभी-कभी, आपको आपके द्वारा चुनी गई तस्वीर से फ़ाइल नहीं मिल सकती है। यह इसलिए है क्योंकि चुना हुआ एक Google+, ड्राइव, ड्रॉपबॉक्स या किसी अन्य प्रदाता से आया है।

सबसे अच्छा समाधान यह है कि सिस्टम को Intent.ACTION_GET_CONTENT के माध्यम से सामग्री चुनने और सामग्री प्रदाता के साथ परिणाम प्राप्त करने के लिए कहा जाए।

आप कोड का अनुसरण कर सकते हैं या मेरे अपडेट किए गए जिस्ट को देख सकते हैं

public void pickImage() {
  Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  intent.setType("image/*");
  startActivityForResult(intent, PICK_PHOTO_FOR_AVATAR);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_PHOTO_FOR_AVATAR && resultCode == Activity.RESULT_OK) {
        if (data == null) {
            //Display an error
            return;
        }
        InputStream inputStream = context.getContentResolver().openInputStream(data.getData());
        //Now you can do whatever you want with your inpustream, save it as file, upload to a server, decode a bitmap...
    }
}

14
if(resultCode == Activity.RESULT_OK) {...}का उपयोग सफलता का पता लगाने / रद्द करने के लिए किया जा सकता है
थम्मे गौड़ा

आप कैसे रास्ता पा सकते हैं?
प्रात:

@ माफ कीजिए, मुझे लगता है कि आप new File(data.getData()).getAbsolutePath()सिर्फ एक अनुमान लगा सकते हैं, मैंने इसे आजमाया नहीं है
किसी ने कहीं

1
FileNotFound खंड में एंड्रॉइड स्टूडियो द्वारा अपवाद चेतावनी getActivity().getContentResolver().openInputStream(data.getData());
इकबाल

1
यह कुछ उपकरणों पर काम करता है जिसमें फ़ाइल का पथ वापस नहीं आता है। हालाँकि, मुझे यह निर्धारित करने का कोई तरीका नहीं दिखता है - एक बार जब मेरे पास इनपुटस्ट्रीम है - तो छवि के उन्मुखीकरण का पता कैसे लगाएं।
केसी पर्किन्स

30
public void FromCamera() {

    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);


}

आपका बहुत बहुत धन्यवाद। इस जवाब ने मुझे बाद में छवि को अपलोड करने में मदद की
रोजारियो परेरा फर्नांडीस

मुझे लगता है कि आप केस 1 का मतलब है: केस -1 के बजाय: OnActivityResult में स्विच करें।
मथियास

मुझे पता है कि यह एक नया सवाल है, लेकिन, हमने चित्र पथ प्राप्त करने के लिए यह सब क्यों किया, क्या डेटा.टगडा रिटर्न देता है?
moumenShobakey

का मूल्य क्या है path? मेंFile file = new File(path);
रवि वानीया 10

23

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

public void pickImage() {
    Intent intent = new Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.INTERNAL_CONTENT_URI);
    intent.setType("image/*");
    intent.putExtra("crop", "true");
    intent.putExtra("scale", true);
    intent.putExtra("outputX", 256);
    intent.putExtra("outputY", 256);
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
}

और के रूप में onActivityResult ओवरराइड करें

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode != RESULT_OK) {
            return;
        }
        if (requestCode == 1) {
            final Bundle extras = data.getExtras();
            if (extras != null) {
                //Get image
                Bitmap newProfilePic = extras.getParcelable("data");
            }
        }
    }

2
@ अभिषेक ... आपको ACTION_PICK के इरादे से एक्स्ट्रा की सूची कहां मिली? धन्यवाद!
जॉनी वू

1
कृपया api_EXTERNAL_STORAGE और WRITE_EXTERNAL_STORAGE के लिए api स्तर 23 और उच्चतर के लिए रनटाइम अनुमतियाँ जोड़ना न भूलें। अन्यथा आपको गैलरी से बिटमैप नहीं मिल सकता है क्योंकि यह शून्य नहीं है। देखें stackoverflow.com/a/35285667/3341089

1
URI सेट करने के बाद setType पर कॉल करने से डेटा क्लियर हो जाएगा।
तस्लीम ओसेनी

11

यहां अनुरोध अनुमति के लिए एक पूर्ण उदाहरण है (यदि आवश्यक हो), गैलरी से छवि चुनें, फिर छवि को bitmapया में बदलेंfile

AndroidManifesh.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

गतिविधि

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_pick_image.setOnClickListener {
            pickImage()
        }
    }

    private fun pickImage() {
        if (ActivityCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
            val intent = Intent(
                Intent.ACTION_PICK,
                MediaStore.Images.Media.INTERNAL_CONTENT_URI
            )
            intent.type = "image/*"
            intent.putExtra("crop", "true")
            intent.putExtra("scale", true)
            intent.putExtra("aspectX", 16)
            intent.putExtra("aspectY", 9)
            startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)
        } else {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),
                READ_EXTERNAL_STORAGE_REQUEST_CODE
            )
        }
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (requestCode == PICK_IMAGE_REQUEST_CODE) {
            if (resultCode != Activity.RESULT_OK) {
                return
            }
            val uri = data?.data
            if (uri != null) {
                val imageFile = uriToImageFile(uri)
                // todo do something with file
            }
            if (uri != null) {
                val imageBitmap = uriToBitmap(uri)
                // todo do something with bitmap
            }
        }
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        when (requestCode) {
            READ_EXTERNAL_STORAGE_REQUEST_CODE -> {
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // pick image after request permission success
                    pickImage()
                }
            }
        }
    }

    private fun uriToImageFile(uri: Uri): File? {
        val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
        val cursor = contentResolver.query(uri, filePathColumn, null, null, null)
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                val columnIndex = cursor.getColumnIndex(filePathColumn[0])
                val filePath = cursor.getString(columnIndex)
                cursor.close()
                return File(filePath)
            }
            cursor.close()
        }
        return null
    }

    private fun uriToBitmap(uri: Uri): Bitmap {
        return MediaStore.Images.Media.getBitmap(this.contentResolver, uri)
    }

    companion object {
        const val PICK_IMAGE_REQUEST_CODE = 1000
        const val READ_EXTERNAL_STORAGE_REQUEST_CODE = 1001
    }
}

डेमो
https://github.com/PhanVanLinh/AndroidPickImage


यह किसी पुस्तकालय से कम नहीं है, खासकर उस फसल और पहलू अनुपात की विशेषता के साथ। मुझे कभी नहीं पता था कि ऐसी कोई चीज मौजूद है। महोदय आपका बहुत बहुत धन्यवाद।
ललित फौजदार

1
यहाँ वापस, यह इतना अच्छा नहीं है क्योंकि मुझे आशा है कि पहले छापों को देखकर। यह स्नैपशॉट के साथ संपादित किए जाने पर छवि को नहीं उठाता है, कोई दुर्घटना नहीं है, लेकिन कोई छवि नहीं है, huawi की डिफ़ॉल्ट गैलरी ऐप कुछ भी नहीं करती है जब मैं संपादन के बाद अगले पर क्लिक करता हूं, तो यह Google फ़ोटो से ली गई छवि को संपादित नहीं करता है, इसे वापस लाएं इसके बिना सीधे। यह तभी अच्छा होता है जब मैं इसे संपादित करने के लिए huawi की डिफ़ॉल्ट गैलरी और Google फ़ोटो चुनता हूँ।
ललित फौजदार

2

यदि आप केवल छवियों और एकाधिक चयन की तलाश में हैं।

@ एक बार https://stackoverflow.com/a/15029515/1136023 देखें

भविष्य व्यक्तिगत रूप से का उपयोग करके अच्छा लग रहा है के लिए यह उपयोगी है MultipleImagePick


लाइब्रेरी के रूप में MultipleImagePick का उपयोग करने का सबसे तेज़ तरीका क्या है? यह स्टैंडअलोन प्रोजेक्ट / एप्लिकेशन के रूप में आता है ..
ticofab

2

डॉक्स के अनुसार, एपीआई मिनट 19 वाले लोगों के लिए उत्तर का अद्यतन प्रस्तुत करने के लिए:

एंड्रॉइड 4.4 (एपीआई स्तर 19) और उच्चतर पर, आपके पास ACTION_OPEN_DOCUMENT इरादे का उपयोग करने का अतिरिक्त विकल्प है, जो एक सिस्टम-नियंत्रित पिकर यूआई नियंत्रित प्रदर्शित करता है जो उपयोगकर्ता को उन सभी फाइलों को ब्राउज़ करने की अनुमति देता है जो अन्य एप्लिकेशन ने उपलब्ध कराई हैं। इस एकल UI से, उपयोगकर्ता किसी भी समर्थित एप्लिकेशन से फ़ाइल चुन सकता है।

Android 5.0 (API स्तर 21) और उच्चतर पर, आप ACTION_OPEN_DOCUMENT_TREE आशय का भी उपयोग कर सकते हैं, जो उपयोगकर्ता को क्लाइंट ऐप तक पहुंचने के लिए निर्देशिका चुनने की अनुमति देता है।

स्टोरेज एक्सेस फ्रेमवर्क का उपयोग करके खुली फाइलें - एंड्रॉइड डॉक्स

     val intent = Intent(Intent.ACTION_OPEN_DOCUMENT)
     intent.type = "image/*"
     startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE)

0

केवल स्थानीय ऐड से चुनें:

        i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)

और यह अच्छा काम कर रहा है:

    val i = Intent(Intent.ACTION_GET_CONTENT,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    i.type = "image/*"
    i.putExtra(Intent.EXTRA_LOCAL_ONLY,true)
    startActivityForResult(Intent.createChooser(i,"Select Photo"),pickImageRequestCode)

-7

यू इस जवाब से आसान कर सकता है:

Uri Selected_Image_Uri = data.getData();
ImageView imageView = (ImageView) findViewById(R.id.loadedimg);
imageView.setImageURI(Selected_Image_Uri);

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

5
एसओ में आपका स्वागत है! अपने स्वयं के पोस्ट पर टिप्पणी करने के बजाय, आप अपनी पोस्ट को संपादित भी कर सकते हैं। यदि आपकी टिप्पणी उत्तर को स्पष्ट करने वाली है, तो उसे उत्तर में ही क्यों रखा जाए? व्यक्तिगत रूप से, मैं यह नहीं देखता कि आपके (पुराने) इस पुराने प्रश्न का उत्तर प्रश्न से कैसे संबंधित है। क्या मुझे पहले उन सवालों के जवाब देने पर ध्यान देने का सुझाव देना चाहिए, जिनके पास अभी तक एक स्वीकृत जवाब नहीं है?
cfi

1
मैं Android सवाल नहीं कर सकते। मैं सिर्फ एंड्रॉइड प्रश्न कैसे देख सकता हूं?
एलिरेज़ा टैगिज़ादेह

3
कृपया मदद पृष्ठ पढ़ें। इसके अलावा, टिप्पणियां इस बात पर चर्चा के लिए नहीं हैं कि साइट कैसे काम करती है, आप अन्य उपयोगकर्ताओं के साथ लाइव चर्चा के लिए चैट रूम का उपयोग कर सकते हैं, और आप मेटा (मदद-> मेटा) पर विशिष्ट प्रश्न पूछ सकते हैं
cfi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.