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

Cách thêm quyền (permission) vào Manifest ứng dụng Android?

Giới thiệu

Hướng dẫn khai báo quyền (permission) trong file AndroidManifest.xml để ứng dụng được phép truy cập tính năng nhạy cảm của thiết bị (camera, vị trí, lưu trữ, rung, internet...).

Các bước thực hiện

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

Khởi tạo project Android Studio.

Bước 2: Layout cơ bả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"
    android:layout_margin="16dp"
    android:orientation="vertical"
    tools:context=".MainActivity" />

Bước 3: MainActivity rỗng (src/MainActivity.java)

package app.tutorialspoint.com.sample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Bước 4: Khai báo quyền trong AndroidManifest.xml

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

    <!-- Quyền rung (VIBRATE) -->
    <uses-permission android:name="android.permission.VIBRATE" />

    <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ị, nhấn Run. Ứng dụng chạy bình thường, quyền VIBRATE đã được cấp (normal permission).

Phân loại quyền quan trọng (Android 6.0+ API 23+)

1. Normal Permissions (Tự động cấp khi cài đặt)

  • INTERNET, VIBRATE, ACCESS_NETWORK_STATE, WAKE_LOCK, BLUETOOTH
  • Không cần xin phép người dùng lúc chạy

2. Dangerous Permissions (Cần xin phép Runtime)

Khai báo trong Manifest VÀ xin phép lúc chạy (requestPermissions):

  • Vị trí: ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION, ACCESS_BACKGROUND_LOCATION
  • Lưu trữ: READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE (API 29+ dùng MediaStore/SAF)
  • Camera/Mic: CAMERA, RECORD_AUDIO
  • Liên hệ/Điện thoại: READ_CONTACTS, CALL_PHONE, READ_PHONE_STATE
  • SMS: SEND_SMS, READ_SMS, RECEIVE_SMS
  • Body sensors: BODY_SENSORS
  • Calendar: READ_CALENDAR, WRITE_CALENDAR

3. Special Permissions (Quy trình riêng)

  • SYSTEM_ALERT_WINDOW (Draw over apps)
  • WRITE_SETTINGS (Modify system settings)
  • REQUEST_INSTALL_PACKAGES (Install unknown apps)

Ví dụ xin quyền Runtime (Dangerous Permission)

// Trong Activity/Fragment
private static final int REQUEST_LOCATION = 100;

void requestLocationPermission() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this,
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
            REQUEST_LOCATION);
    } else {
        // Đã có quyền, làm việc tại đây
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    if (requestCode == REQUEST_LOCATION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Được cấp quyền
        } else {
            // Bị từ chối, giải thích hoặc disable tính năng
        }
    }
}

Best Practices

  • Chỉ xin quyền thực sự cần thiết (原則 tối thiểu)
  • Giải thích lý do trước khi xin (show rationale)
  • Xử lý graceful khi bị từ chối (không crash, disable feature)
  • Test trên nhiều phiên bản Android (quyền thay đổi theo API level)
  • Khai báo uses-permission-sdk-23 cho quyền chỉ cần trên API 23+