আমার অ্যাপ্লিকেশনটির জন্য গ্যালারী (এসডি কার্ড) থেকে কীভাবে চিত্র চয়ন করবেন?


343

এই প্রশ্নটি মূলত অ্যান্ড্রয়েড 1.6 এর জন্য জিজ্ঞাসা করা হয়েছিল।

আমি আমার অ্যাপ্লিকেশনটিতে ফটো বিকল্পগুলিতে কাজ করছি।

আমার ক্রিয়াকলাপে আমার কাছে একটি বোতাম এবং একটি চিত্র ভিউ রয়েছে। আমি যখন বোতামটি ক্লিক করব তখন এটি গ্যালারিতে পুনর্নির্দেশ করবে এবং আমি একটি চিত্র নির্বাচন করতে সক্ষম হব। নির্বাচিত চিত্রটি আমার ইমেজভিউতে উপস্থিত হবে।


1
এই উত্তরটি দেখুন, আমি ফাইল পরিচালকদের কাছ থেকে পিকগুলি
পাগল

উত্তর:


418

প্রায় 5 বছর পরে উত্তর আপডেট হয়েছে:

মূল উত্তরের কোডটি আর নির্ভরযোগ্যতার সাথে কাজ করে না, কারণ বিভিন্ন উত্স থেকে প্রাপ্ত চিত্রগুলি মাঝে মাঝে ভিন্ন সামগ্রী ইউআরআই দিয়ে আসে, content://তার চেয়ে বেশি file://। আরও ভাল সমাধান হ'ল সহজভাবে ব্যবহার করা context.getContentResolver().openInputStream(intent.getData()), কারণ এটি এমন একটি ইনপুট স্ট্রিম ফিরিয়ে দেবে যা আপনি পছন্দ হিসাবে পরিচালনা করতে পারেন।

উদাহরণস্বরূপ, BitmapFactory.decodeStream()এই পরিস্থিতিতে নিখুঁতভাবে কাজ করে, যেমন আপনি পরে বড় চিত্রগুলিকে ডাউনসাম্পল করতে এবং মেমরির সমস্যাগুলি এড়াতে বিকল্পগুলি এবং ইনস্যাম্পল সাইজ ক্ষেত্রটিও ব্যবহার করতে পারেন।

তবে গুগল ড্রাইভের মতো জিনিসগুলি ইউআরআইগুলিকে চিত্রগুলিতে ফিরিয়ে দেয় যা আসলে ডাউনলোড করা হয়নি। অতএব আপনাকে পটভূমির থ্রেডে 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 টি কলাম রয়েছে তথ্যের ফাইলপথ থেকে 'শেষ তারিখের সংশোধিত তারিখ' অবধি যেখানে ছবি তোলা হয়েছিল তার জিপিএস স্থানাঙ্ক পর্যন্ত, যদিও ক্ষেত্রের বেশিরভাগ ক্ষেত্র প্রকৃতপক্ষে ব্যবহৃত হয় না।

আপনার অন্যান্য ক্ষেত্রের প্রয়োজন না হওয়ায় সময় বাঁচানোর জন্য কার্সার অনুসন্ধান ফিল্টার দিয়ে করা হয়। ফিল্টারটি আপনার পছন্দসই কলামের নাম, মিডিয়াস্টোর.আইমেজস.মিডিয়া.ডেটা উল্লেখ করে এবং সেই পথটি [] ব্যবহার করে কার্সার কোয়েরিতে এই স্ট্রিং [] সরবরাহ করে কাজ করে। কার্সার ক্যোয়ারীটি সেই পথটি দিয়ে ফিরে আসে, তবে আপনি columnIndexকোডটি ব্যবহার না করা পর্যন্ত কোন কলামে তা জানেন না । এটি কেবল তার নামের উপর ভিত্তি করে কলামের নম্বর পায়, ফিল্টারিংয়ের ক্ষেত্রে একই ব্যবহার করা হয়। একবার আপনি এটি পেয়ে গেলে আপনি শেষ অবধি আমার দেওয়া কোডের শেষ লাইনটি দিয়ে বিটম্যাপে চিত্রটি ডিকোড করতে সক্ষম হবেন।


4
কার্সার.মোভটো ফার্স্ট () অস্তিত্বের জন্য যাচাই করা উচিত: যদি (কার্সার.মোভ টো ফার্স্ট ()) curs কার্সার ডেটা দিয়ে কিছু করুন}
মিশকিন

14
কার্সারের পরিবর্তে আপনার ছবিটি এইভাবে পাওয়া উচিত: বিটম্যাপ বি = মিডিয়াস্টোর.আইমেজস.মিডিয়া.সেটবিটম্যাপ (this.getContentResolver (), নির্বাচিত চিত্র);
লুইজি আগোস্তি

4
লুইজি, যদি বিটম্যাপটি বড় মিডিয়াস্টোর হয় ma ছবিগুলি M স্টিভের পদ্ধতিটি মেমরিতে লোড করার আগে চিত্রটি নীচে স্কেল করার অনুমতি দেয়।
ফ্র্যাঙ্ক হার্পার

9
এটি আমার পক্ষে কাজ করছে না, আমি কার্সার থেকে পেয়েছি getগেটস্ট্রিং (কলাম ইন্ডেক্স);
অ্যালেক্সিস পাউট্রোট

9
এই পদ্ধতির সাথে যত্নবান: ব্যবহারকারী যখন কোনও পিকাসা অ্যালবাম বা Google+ ফটো অ্যাপ থেকে কোনও ফটো বাছাই করে তখন ফাইলের নামটি 'নাল' হয়ে যাবে।
সিস্কে বোকেলো

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

বিকল্পভাবে, আপনি আউটআফমেমরি ত্রুটিগুলি এড়াতে আপনার চিত্রটি ডাউনসাম্পল করতে পারেন।

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

    }

8
আমার ছোট 100px দ্বারা 100px ইমেজভিউতে 1.5MB জেপিগ রাখার ফলে ভিএম মেমরির ত্রুটি থেকে যায়। ডাউনস্যাম্পলিং সেই সমস্যাটি সমাধান করেছে :-)
কোথাও কেউ

1
ওহে. উভয় ধারা বন্ধ করা উচিত নয়?
ডেনিস নাইজিয়াভ

হ্যালো @ সিয়ামি..আমি আপনার কোডটি অনুসরণ করেছি..কিন্তু এটি আমার জন্য আংশিকভাবে কাজ করছে .. :( যখন ছবিটি ক্যাপচার করা চিত্র বিভাগের অধীনে গ্যালারী থেকে নির্বাচন করা হয়, তখন এটি জসন ত্রুটি দিচ্ছে, তবে যখন ব্লুটুথ বিভাগের অধীনে চিত্রটি গ্যালারী থেকে নির্বাচন করা হয় ইমেজ অ্যাক্সেস এবং server..could পাঠানো হয় যদি আপনি এই লিঙ্কটি পরীক্ষা করুন এবং আমাকে কোনো সমাধান সুপারিশ করুন ... দয়া করে stackoverflow.com/questions/29234409/image-is-not-uploaded
Prabs

স্কেলটি সন্ধান করার বিভাগটি এইভাবে লেখা যেতে পারে:int scale = 1; for ( ; bfOptions.outWidth / scale > TARGET_SIZE && bfOptions.outWidth > TARGET_SIZE; scale*=2);
The_Rafi

@ সিয়ামি এই পদ্ধতিটি কোথায় এবং কীভাবে কল করবেন -------- ডিকোড ইউরি
অক্ষয় কুমার ২

87

আপনাকে ফলাফলের জন্য গ্যালারী অভিপ্রায় শুরু করতে হবে।

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

তারপরে onActivityForResult, intent.getData()চিত্রটির উরি পেতে কল করুন । তারপরে আপনার সামগ্রী সামগ্রী সরবরাহকারীর কাছ থেকে চিত্রটি নেওয়া দরকার।


অন্য দুটি উত্তরে ব্যবহৃত ACTION_GET_CONTENT এর থেকে কীভাবে ACTION_PICK আলাদা?
পেঙ্গুইন 359

4
ACTION_PICK এর সাহায্যে আপনি একটি নির্দিষ্ট ইউআরআই নির্দিষ্ট করেন এবং ACTION_GET_CONTENT এর সাথে আপনি একটি মাইম_ টাইপ নির্দিষ্ট করেন। আমি ACTION_PICK ব্যবহার করেছি কারণ প্রশ্নটি বিশেষত SDCARD থেকে প্রাপ্ত চিত্র এবং সমস্ত চিত্র নয়।
রবি পুকুর

2
কুল। এটি ঠিক আমার প্রয়োজনের মতো এবং কবিতার মতো কাজ করেছিল :)
ভাবছেন

@ উইলিয়ামকিনা অ্যাকটিভিটি_এসইএলসিT_আইএমএজ হ'ল কোনও ফলাফল যা আপনার প্রত্যাশা প্রত্যাশিত ফলাফলটি সনাক্ত করার জন্য নির্দিষ্ট করে specify এরপরে এটি 'রিকোয়েস্টকোড' হিসাবে অ্যাক্টিভিটি রেজাল্ট (ইন রিকোস্টকোড, ইনট রেজাল্টকোড, ইনটেন্ট ডেটা) ফেরত পাঠানো হয়।
ফাইডো

@ ফাইদো আমি বুঝতে পেরেছিলাম পরে, ধন্যবাদ
উইলিয়াম কিনান

22

এখানে চিত্র এবং ভিডিওর জন্য একটি পরীক্ষিত কোড রয়েছে t এটি 19 টিরও কম এবং 19 এরও বেশি সমস্ত API এর জন্য কাজ করবে।

চিত্র:

if (Build.VERSION.SDK_INT <= 19) {
                        Intent i = new Intent();
                        i.setType("image/*");
                        i.setAction(Intent.ACTION_GET_CONTENT);
                        i.addCategory(Intent.CATEGORY_OPENABLE);
                        startActivityForResult(i, 10);
                    } else if (Build.VERSION.SDK_INT > 19) {
                        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(intent, 10);
                    }

ভিডিও:

if (Build.VERSION.SDK_INT <= 19) {
                        Intent i = new Intent();
                        i.setType("video/*");
                        i.setAction(Intent.ACTION_GET_CONTENT);
                        i.addCategory(Intent.CATEGORY_OPENABLE);
                        startActivityForResult(i, 20);
                    } else if (Build.VERSION.SDK_INT > 19) {
                        Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Video.Media.EXTERNAL_CONTENT_URI);
                        startActivityForResult(intent, 20);
                    }    

     @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {               
            if (requestCode == 10) {
                Uri selectedImageUri = data.getData();
                String selectedImagePath = getRealPathFromURI(selectedImageUri);
            } else if (requestCode == 20) {
                Uri selectedVideoUri = data.getData();
                String selectedVideoPath = getRealPathFromURI(selectedVideoUri);
            }
        }
     }

     public String getRealPathFromURI(Uri uri) {
            if (uri == null) {
                return null;
            }
            String[] projection = {MediaStore.Images.Media.DATA};
            Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null, null);
            if (cursor != null) {
                int column_index = cursor
                        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            }
            return uri.getPath();
        }

14

গ্যালারীটি চালু করতে এবং ব্যবহারকারীকে কোনও চিত্র বাছাই করার জন্য এটি করুন:

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

তারপরে আপনার onActivityResult()ব্যবহারে সেই চিত্রটির ইউআরআই যা আপনার ইমেজভিউতে চিত্র সেট করতে ফিরে আসে।


3
এই অ্যান্ড্রয়েড 4.4 ডিভাইসের জন্য কাজ করবে না। এটি সাম্প্রতিক নথির স্ক্রিনটি চালু করবে।
নওন্ডলা সন্দীপ


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

}

8
public class BrowsePictureActivity extends Activity {
private static final int SELECT_PICTURE = 1;

private String selectedImagePath;

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

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

                public void onClick(View arg0) {

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

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
        }
    }
}

public String getPath(Uri uri) {

        if( uri == null ) {
            return null;
        }

        // this will only work for images selected from gallery
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor cursor = managedQuery(uri, projection, null, null, null);
        if( cursor != null ){
            int column_index = cursor
            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }

        return uri.getPath();
}

}


4

কিছু কারণে, এই থ্রেডের সমস্ত উত্তর, onActivityResult()প্রাপ্তির পোস্ট-প্রক্রিয়া করার চেষ্টা করে Uri, যেমন চিত্রটির আসল পথ পাওয়া এবং তারপরে BitmapFactory.decodeFile(path)এটি পেতে ব্যবহার করুনBitmap

এই পদক্ষেপ অপ্রয়োজনীয়। ImageViewবর্গ একটি পদ্ধতি বলা setImageURI(uri)। আপনার ইউরি এটি পাস এবং আপনার করা উচিত।

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

একটি সম্পূর্ণ কাজের উদাহরণের জন্য আপনি এখানে একবার দেখতে পারেন: http://androidbitmama.blogspot.com/2015/04/loading-images-in-android-part-iii-pick.html

দ্রষ্টব্য:
পথ Bitmapএকটি পৃথক পরিবর্তনশীল মধ্যে ক্ষেত্রে যেখানে ইমেজ লোড করা হবে হবে বুদ্ধিমানের মেমরি মাপসই অত্যন্ত বড় এবং ক্রিয়াকলাপের নিচে স্কেলে প্রতিরোধ করা প্রয়োজন OurOfMemoryError, @siamii উত্তর দেখানো মত।


3

কল নির্বাচন করুন ইমেজ পদ্ধতি যেমন-

public void chooseImage(ImageView v)
{
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, SELECT_PHOTO);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    if(imageReturnedIntent != null)
    {
        Uri selectedImage = imageReturnedIntent.getData();
    switch(requestCode) { 
    case SELECT_PHOTO:
        if(resultCode == RESULT_OK)
        {
            Bitmap datifoto = null;
            temp.setImageBitmap(null);
            Uri picUri = null;
            picUri = imageReturnedIntent.getData();//<- get Uri here from data intent
             if(picUri !=null){
               try {
                   datifoto = android.provider.MediaStore.Images.Media.getBitmap(this.getContentResolver(),                                 picUri);
                   temp.setImageBitmap(datifoto);
               } catch (FileNotFoundException e) {
                  throw new RuntimeException(e);
               } catch (IOException e) {
                  throw new RuntimeException(e);
               } catch (OutOfMemoryError e) {
                Toast.makeText(getBaseContext(), "Image is too large. choose other", Toast.LENGTH_LONG).show();
            }

        }
        }
        break;

}
    }
    else
    {
        //Toast.makeText(getBaseContext(), "data null", Toast.LENGTH_SHORT).show();
    }
}

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


}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.