কম্পিউটার টিউটোরিয়াল

অ্যান্ড্রয়েডে রানটাইম পারমিশন সহ এক্সটার্নাল স্টোরেজ থেকে ইমেজ পড়া

এই উদাহরণে দেখানো হয়েছে কিভাবে রানটাইম পারমিশন (READ_EXTERNAL_STORAGE) হ্যান্ডল করে এক্সটার্নাল স্টোরেজ থেকে ইমেজ পড়ে ImageView-এ দেখানো যায়।

স্টেপ ১: নতুন প্রজেক্ট তৈরি

স্টেপ ২: res/layout/activity_main.xml


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

    <Button
        android:id = "@+id/read"
        android:text = "read"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content" />

    <ImageView
        android:id = "@+id/imageView"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content" />
</LinearLayout>

স্টেপ ৩: src/MainActivity.java


package com.example.andy.myapplication;

import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import java.io.File;

public class MainActivity extends AppCompatActivity {
    private static final int PERMISSION_REQUEST_CODE = 100;
    Button read;
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        imageView = findViewById(R.id.imageView);
        read = findViewById(R.id.read);
        
        read.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String state = Environment.getExternalStorageState();
                if (Environment.MEDIA_MOUNTED.equals(state)) {
                    if (Build.VERSION.SDK_INT >= 23) {
                        if (checkPermission()) {
                            loadImageFromExternal();
                        } else {
                            requestPermission();
                        }
                    } else {
                        loadImageFromExternal();
                    }
                } else {
                    Toast.makeText(this, "External storage not mounted", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    private void loadImageFromExternal() {
        File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/images.jpeg");
        if (dir.exists()) {
            Log.d("path", dir.toString());
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            Bitmap bitmap = BitmapFactory.decodeFile(dir.getAbsolutePath(), options);
            imageView.setImageBitmap(bitmap);
        } else {
            Toast.makeText(this, "File not found", Toast.LENGTH_SHORT).show();
        }
    }

    private boolean checkPermission() {
        int result = ContextCompat.checkSelfPermission(this,
            android.Manifest.permission.READ_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED;
    }

    private void requestPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
            Toast.makeText(this, "Read permission needed to access images", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(this,
                new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == PERMISSION_REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                loadImageFromExternal();
            } else {
                Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show();
            }
        }
    }
}

স্টেপ ৪: AndroidManifest.xml


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

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

    <application ...>
        <activity android:name = ".MainActivity"> ... </activity>
    </application>
</manifest>

মডার্ন নোট (Android 10+ / API 29+)

  • READ_EXTERNAL_STORAGE পারমিশন Android 10+ তে মিডিয়া ফাইলের জন্য বাধ্যতামূলক নয় (MediaStore ব্যবহার করলে)।
  • অ্যাপ-স্পেসিফিক ডিরেক্টরি (getExternalFilesDir()) পড়তে পারমিশন লাগে না।
  • MediaStore API ব্যবহার করা উচিত পাবলিক মিডিয়া ফাইল অ্যাক্সেসের জন্য।
  • Environment.getExternalStorageDirectory() ডিপ্রিকেটেড।

রান করা

ডিভাইস কানেক্ট করে Run করুন। "read" বাটন ক্লিক করলে পারমিশন মাগবে (যদি না দেয়া থাকে), Allow করলে ইমেজ লোড হবে।

  1. অ্যান্ড্রয়েডে Assets ফোল্ডার থেকে ফাইল পড়ার পদ্ধতি

  2. অ্যান্ড্রয়েড অ্যাপে সিম্পল টেক্সট ফাইল পড়ার পদ্ধতি

  3. Android-এ SD কার্ডে ফোল্ডার/ফাইলে লিখার অনুমতি সেট করার পদ্ধতি

  4. রুবিতে ফাইল পড়া এবং লেখা: একটি স্টেপ-বাই-স্টেপ গাইড