Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách đọc file ảnh từ bộ nhớ ngoài với quyền runtime trong Android


Ví dụ này minh họa cách đọc file ảnh từ bộ nhớ ngoài (external storage) với quyền runtime trên Android.

Bước 1: Tạo dự án mới

Tạo dự án mới trong Android Studio: File → New Project, điền thông tin cần thiết.

Bước 2: Thiết kế giao diện (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 = "Đọc"
        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>

Giao diện có ImageView và nút Đọc. Khi nhấn nút, ảnh sẽ được đọc từ bộ nhớ ngoài và hiển thị lên ImageView.

Bước 3: Code 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()) {
                            readImageFromExternalStorage();
                        } else {
                            requestPermission();
                        }
                    } else {
                        readImageFromExternalStorage();
                    }
                }
            }
        });
    }

    private void readImageFromExternalStorage() {
        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, "Không tìm thấy file ảnh", Toast.LENGTH_SHORT).show();
        }
    }

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

    private void requestPermission() {
        if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
            Toast.makeText(MainActivity.this, "Quyền đọc bộ nhớ ngoài cho phép đọc file. Vui lòng cấp quyền trong Cài đặt.", Toast.LENGTH_LONG).show();
        } else {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case PERMISSION_REQUEST_CODE:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.e("value", "Đã cấp quyền, giờ có thể đọc bộ nhớ ngoài.");
                    readImageFromExternalStorage();
                } else {
                    Log.e("value", "Quyền bị từ chối, không thể đọc bộ nhớ ngoài.");
                }
                break;
        }
    }
}

Bước 4: Cấu hình 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
        android:allowBackup = "true"
        android:icon = "@mipmap/ic_launcher"
        android:label = "@string/app_name"
        android:roundIcon = "@mipmap/ic_launcher_round"
        android:supportsRtl = "true"
        android:theme = "@style/AppTheme">
        <activity android:name = ".MainActivity">
            <intent-filter>
                <action android:name = "android.intent.action.MAIN" />
                <category android:name = "android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

Chạy ứng dụng

Kết nối thiết bị, chạy từ Android Studio. Màn hình hiển thị giao diện mặc định.

Cách đọc file ảnh từ bộ nhớ ngoài với quyền runtime trong Android

Nhấn nút Đọc để hiển thị ảnh từ bộ nhớ ngoài như hình dưới:

Cách đọc file ảnh từ bộ nhớ ngoài với quyền runtime trong Android