অ্যান্ড্রয়েড গ্যালারী থেকে চিত্র চয়ন করুন


196

আমি গ্যালারী থেকে একটি চিত্র চয়নকারী তৈরি করতে চাই। আমি কোড ব্যবহার করি

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

আমার সমস্যাটি হ'ল এই ক্রিয়াকলাপে এবং ভিডিও ফাইলগুলি প্রদর্শিত হয়। এই ক্রিয়াকলাপে কোনও ভিডিও ফাইল প্রদর্শিত না হওয়ার জন্য প্রদর্শিত ফাইলগুলি ফিল্টার করার কোনও উপায় আছে কি?


3
এই নিবন্ধটি গ্যালারি থেকে চিত্রগুলি কীভাবে চয়ন করবেন তা সুন্দরভাবে বর্ণনা করেছে: androidbitmama.blogspot.com/2015/04/…
অ্যান্ডি রেস

আপনার মত একই প্রশ্ন আছে। stackoverflow.com/a/31382240/1835650
TeeTracker

উত্তর:


343

একেবারে। এটা চেষ্টা কর:

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 "প্রতীকটি সমাধান করা যায় না
মাইকেল 18 ই

3
@ মিশেল দ্য পিক_আইএমএজ ধ্রুবকটি এই খুব শ্রেণীর উপর আপনার দ্বারা নির্ধারিত কোনও স্থিতিশীল মান রাখে , এটি @Overrideফাংশনে আরও ব্যবহৃত হয় onActivityResult(int requestCode, resultCode, Intent data), যেখানে requestCodeকোনও পদক্ষেপ নেওয়ার আগে প্যারামিটারটি পরীক্ষা করার জন্য আপনি এই ধ্রুবকটি ব্যবহার করার পরামর্শ দেওয়া হয় :)
গ্যাব্রিয়েল চেকিয়া ভিটালি

নিম্নলিখিত কোডটি (অনুমান করে RESULT_OK) দিয়ে অ্যান্টিভিটি রেজাল্ট (...) পদ্ধতি থেকে আপনি বিটম্যাপটি পুনরুদ্ধার করতে পারেন: বিটম্যাপ বিটম্যাপ = ডেটাগেটএক্সট্রাস ()। getParcelable ("ডেটা");
Shn_Android_Dev

196

কখনও কখনও, আপনি পছন্দ করে নিন এমন চিত্র থেকে কোনও ফাইল পাবেন না। এর কারণ চয়নকর্তা Google+, ড্রাইভ, ড্রপবক্স বা অন্য কোনও সরবরাহকারী থেকে এসেছিলেন।

সর্বোত্তম সমাধান হ'ল সিস্টেমকে এর মাধ্যমে একটি সামগ্রী চয়ন করতে বলা ইনটেন্ট.এ্যাকশন_জিইT_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) {...}সাফল্য সনাক্ত করতে / বাতিল করতে ব্যবহার করা যেতে পারে
থম্মে গওদা

আপনি কিভাবে পথ পেতে পারেন?
27 এ বিতরণ করুন

@ ডেলিভ, আমি মনে করি আপনি new File(data.getData()).getAbsolutePath()কেবল একটি অনুমান চেষ্টা করতে পারেন , আমি চেষ্টা করে দেখিনি
কেউ কেউ কোথাও

1
এন্ড্রেডমেন্টে অ্যান্ড্রয়েড স্টুডিওর দ্বারা ফাইলনটফাউন্ড ব্যতিক্রম সতর্কতা 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 এর পরিবর্তে: অনঅ্যাক্টিভিটি রিসাল্টে স্যুইচ করুন।
ম্যাথিয়াস

আমি জানি এটি একটি নতুন প্রশ্ন but
moumenShobakey

এর মান কী path? ইনFile file = new File(path);
রবি ভানিয়া

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

এবং কার্যকলাপের ফলাফল হিসাবে ওভাররাইড করুন

    @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
@ অভিষেক ... আপনি অ্যাকশন_পিক ইন্টেন্টের জন্য অনুমোদিত অতিরিক্তগুলির তালিকা কোথায় পেয়েছেন? ধন্যবাদ!
জনি উ

1
দয়া করে এপিআই স্তরের 23 এবং ততোধিকের জন্য READ_EXTERNAL_STORAGE এবং WRITE_EXTERNAL_STORAGE এর জন্য রানটাইম অনুমতি যুক্ত করতে ভুলবেন না। অন্যথায় আপনি গ্যালারী থেকে বিটম্যাপটি নਾਲ হিসাবে নাও পেতে পারেন। দেখুন stackoverflow.com/a/35285667/3341089
oguzhan

1
ইউআরআই সেট করার পরে সেট টাইপ কল করা ডেটা সাফ করবে।
তাসলিম ওসেনি

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/AndroidPickI छवि


এটি কোনও লাইব্রেরির চেয়ে কম নয়, বিশেষত সেই ক্রপ এবং দিক অনুপাত বৈশিষ্ট্য সহ। আমি কখনই জানতাম না যে এরকম একটি অস্তিত্ব আছে। আপনাকে অনেক ধন্যবাদ স্যার.
ললিত ফৌজদার

1
এখানে ফিরে, এটি এতটা ভাল নয় যেমনটি আমি প্রথম ইমপ্রেশনগুলি দেখেছি বলে আশা করি। স্ন্যাপসীড দিয়ে সম্পাদনা করার সময় এটি চিত্রটি বাছাই করে না, কোনও ক্র্যাশ নয় তবে কোনও চিত্র নেই, হুয়াওয়ের ডিফল্ট গ্যালারী অ্যাপ্লিকেশন সম্পাদন করার পরে যখন আমি ক্লিক করি তখন কিছুই করে না, গুগল ফটো থেকে বাছাই করার পরে এটি চিত্রটি সম্পাদনা করে না, এটিকে ফিরিয়ে আনবে এটি সরাসরি ছাড়া। এটি সম্পাদন করার জন্য আমি যদি হুয়াওয়ের ডিফল্ট গ্যালারী এবং গুগল ফটোগুলি পছন্দ করি তবেই এটি ভাল কাজ করে।
ললিত ফৌজদার

2

আপনি যদি কেবল চিত্র এবং একাধিক নির্বাচন অনুসন্ধান করেন।

একবার @ https://stackoverflow.com/a/15029515/1136023 এ দেখুন

এটি ভবিষ্যতের জন্য সহায়ক Multi মাল্টিপ্লেজ্যাম্পপিক ব্যবহার করে আমি ব্যক্তিগতভাবে দুর্দান্ত বোধ করি ।


মাল্টিপ্লেজিম্পিক লাইব্রেরি হিসাবে ব্যবহার করার দ্রুততম উপায় কী? এটি একটি স্বতন্ত্র প্রকল্প / অ্যাপ্লিকেশন হিসাবে আসে ..
টিকোফ্যাব

1

দস্তাবেজগুলি অনুসারে, এপিআই মিনিট 19 এর সাথে লোকদের উত্তরের জন্য একটি আপডেট অফার করার জন্য:

অ্যান্ড্রয়েড 4.৪ (এপিআই স্তর ১৯) এবং উচ্চতরতে আপনার কাছে ACTION_OPEN_DOCUMENT অভিপ্রায়টি ব্যবহার করার অতিরিক্ত বিকল্প রয়েছে যা একটি সিস্টেম-নিয়ন্ত্রিত চয়নকারী UI প্রদর্শন করে যা ব্যবহারকারীকে অন্যান্য অ্যাপ্লিকেশনগুলির দ্বারা উপলব্ধ সমস্ত ফাইল ব্রাউজ করার অনুমতি দেয়। এই একক UI থেকে, ব্যবহারকারী যে কোনও সমর্থিত অ্যাপ্লিকেশন থেকে একটি ফাইল বাছাই করতে পারে।

অ্যান্ড্রয়েড 5.0 (এপিআই স্তরের 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
তাই আপনাকে স্বাগতম! নিজের পোস্টে মন্তব্য করার পরিবর্তে আপনি নিজের পোস্টটিও সম্পাদনা করতে পারবেন। যদি আপনার মন্তব্যে উত্তরটি ব্যাখ্যা করার কথা রয়েছে, তবে কেন এটি উত্তরটি নিজের মধ্যে রাখবেন না? ব্যক্তিগতভাবে, আমি দেখতে পাচ্ছি না যে এই (পুরানো) প্রশ্নের উত্তরটি কীভাবে প্রশ্নের সাথে সম্পর্কিত। আমি কি প্রথমে প্রশ্নের উত্তর দেওয়ার দিকে মনোনিবেশ করার পরামর্শ দিতে পারি, যার উত্তর এখনও স্বীকৃত নেই?
সিএফআই

1
আমি অ্যান্ড্রয়েডের প্রশ্নগুলি খুঁজে পাই না। আমি কীভাবে কেবল অ্যান্ড্রয়েড প্রশ্ন দেখতে পারি?
আলিরিজা তাগিজাদেহ

3
সহায়তা পৃষ্ঠা পড়ুন। এছাড়াও, মন্তব্যগুলি সাইটটি কীভাবে কাজ করে সে সম্পর্কে আলোচনার জন্য নয়, আপনি অন্যান্য ব্যবহারকারীর সাথে সরাসরি আলোচনার জন্য চ্যাট রুমগুলি ব্যবহার করতে পারেন, এবং আপনি মেটা (
সহায়তা-
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.