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

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

এই উদাহরণে দেখানো হয়েছে কিভাবে রানটাইম পারমিশন হ্যান্ডল করে এক্সটার্নাল স্টোরেজ থেকে একটি টেক্সট ফাইল (sample.txt) পড়ে TextView-এ দেখানো যায়। (ফাইলটি পূর্বে /text/ ফোল্ডারে থাকা অনুমান করা হয়েছে।)

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

স্টেপ ২: 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" />

    <TextView
        android:id = "@+id/output"
        android:layout_width = "wrap_content"
        android:textSize = "25sp"
        android:layout_height = "wrap_content" />
</LinearLayout>

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


package com.example.andy.myapplication;

import android.content.pm.PackageManager;
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.TextView;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        output = findViewById(R.id.output);
        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()) {
                            readTextFile();
                        } else {
                            requestPermission();
                        }
                    } else {
                        readTextFile();
                    }
                }
            }
        });
    }

    private void readTextFile() {
        File sdcard = Environment.getExternalStorageDirectory();
        File dir = new File(sdcard.getAbsolutePath() + "/text/");
        
        if (dir.exists()) {
            File file = new File(dir, "sample.txt");
            StringBuilder text = new StringBuilder();
            
            try {
                BufferedReader br = new BufferedReader(new FileReader(file));
                String line;
                while ((line = br.readLine()) != null) {
                    text.append(line);
                    text.append('\n');
                }
                br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            output.setText(text.toString());
        } else {
            output.setText("Directory not found");
        }
    }

    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 files", 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) {
                readTextFile();
            } 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>

রান করা

ডিভাইসে রান করুন। "read" বাটন ক্লিক করলে পারমিশন মাগবে (প্রথমবারের মতো), Allow করলে /text/sample.txt ফাইলটির কন্টেন্ট TextView-এ দেখাবে।

ব্যাখ্যা

  • BufferedReader + FileReader দিয়ে লাইন বাই লাইন পড়া হয়েছে।
  • StringBuilder দিয়ে কন্টেন্ট জমা করা হয়েছে (String concatenation-से দ্রুত)।
  • পারমিশন হ্যান্ডলিং লজিক ইমেজ রিড/রাইটের মতোই।

মডার্ন বিকল্প (Kotlin + Coroutines + Scoped Storage)

আধুনিক অ্যান্ড্রয়েড ডেভেলপমেন্টে Kotlin, Coroutines, MediaStore API, Storage Access Framework (SAF) ব্যবহার করা হয়।

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

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

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

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