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

Bật rung và đèn LED cho thông báo Android

Giới thiệu

Ví dụ này minh họa cách kích hoạt rung (vibration) và đèn LED (notification light) cho thông báo Android thông qua NotificationChannel (Android 8.0+).

Yêu cầu

  • Quyền VIBRATE trong Manifest
  • Thiết bị có phần cứng rung/LED (nhiều phone hiện nay không còn LED)
  • Android 8.0+ (API 26+) dùng NotificationChannel

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

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

Tạo project Android Studio mới.

Bước 2: Layout chính (res/layout/activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <Button
        android:onClick="createNotification"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="16dp"
        android:text="Tạo thông báo Rung + LED" />

</RelativeLayout>

Bước 3: Custom Layout (res/layout/custom_notification_layout.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="96dp"
    android:padding="10dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentStart="true"
        android:layout_marginEnd="10dp"
        android:contentDescription="@string/app_name"
        android:src="@mipmap/ic_launcher" />

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toEndOf="@id/image"
        android:text="Thông báo có rung & LED"
        android:textColor="#000"
        android:textSize="18sp" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/title"
        android:layout_marginTop="8dp"
        android:layout_toEndOf="@id/image"
        android:hint="Nhập nội dung..."
        android:inputType="text"
        android:textSize="14sp" />

</RelativeLayout>

Bước 4: MainActivity cấu hình Channel (src/MainActivity.java)

package app.tutorialspoint.com.notifyme;

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.RemoteViews;

public class MainActivity extends AppCompatActivity {
    public static final String NOTIFICATION_CHANNEL_ID = "10001";
    private final static String default_notification_channel_id = "default";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void createNotification(View view) {
        RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.custom_notification_layout);

        NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
            MainActivity.this, default_notification_channel_id);

        mBuilder.setContent(contentView);
        mBuilder.setSmallIcon(R.drawable.ic_launcher_foreground);
        mBuilder.setAutoCancel(true);
        mBuilder.setVisibility(NotificationCompat.VISIBILITY_SECRET);

        // PATTERN RUNG: {delay, rung, delay, rung...} đơn vị millisecond
        long[] VIBRATE_PATTERN = {0, 500, 200, 500, 200, 1000};

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            int importance = NotificationManager.IMPORTANCE_HIGH;
            NotificationChannel notificationChannel = new NotificationChannel(
                NOTIFICATION_CHANNEL_ID, "Kênh Rung & LED", importance);

            // CẤU HÌNH LED
            notificationChannel.setLightColor(getResources().getColor(R.color.colorAccent));
            notificationChannel.enableLights(true);

            // CẤU HÌNH RUNG
            notificationChannel.setVibrationPattern(VIBRATE_PATTERN);
            notificationChannel.enableVibration(true);

            mBuilder.setChannelId(NOTIFICATION_CHANNEL_ID);
            assert mNotificationManager != null;
            mNotificationManager.createNotificationChannel(notificationChannel);
        }

        assert mNotificationManager != null;
        mNotificationManager.notify((int) System.currentTimeMillis(), mBuilder.build());
    }
}

Bước 5: AndroidManifest.xml

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

    <!-- BẮT BUỘC ĐỂ RUNG HOẠT ĐỘNG -->
    <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>

Chi tiết Vibration Pattern

long[] pattern = {
    0,      // Delay ban đầu (ms)
    500,    // Rung 500ms
    200,    // Nghỉ 200ms
    500,    // Rung 500ms
    200,    // Nghỉ 200ms
    1000    // Rung 1000ms
};
// Tổng: 2.4 giây
  • Số chẵn (index 0,2,4...): Thời gian nghỉ (delay)
  • Số lẻ (index 1,3,5...): Thời gian rung (vibrate)
  • Index 0 thường là 0 (bắt đầu ngay)

Cấu hình LED

notificationChannel.setLightColor(Color.RED); // Màu LED
notificationChannel.enableLights(true);        // Bật LED
  • Chỉ hoạt động trên thiết bị CÓ đèn LED thông báo (ít phone hiện nay có)
  • Màu LED do phần cứng quyết định, có thể không chính xác màu đặt
  • LED thường nhấp nháy khi có thông báo mới, tắt khi user xem

API Level < 26 (Trước Android O)

// Cách cũ (deprecated nhưng vẫn chạy)
Notification notification = builder.build();
notification.defaults |= Notification.DEFAULT_VIBRATE;
notification.defaults |= Notification.DEFAULT_LIGHTS;
// Hoặc custom:
notification.vibrate = new long[]{0, 500, 200, 500};
notification.ledARGB = Color.RED;
notification.ledOnMS = 500;
notification.ledOffMS = 500;
notification.flags |= Notification.FLAG_SHOW_LIGHTS;

Chạy thử nghiệm

Cài đặt trên thiết bị THỰC (emulator không rung/LED). Nhấn nút tạo thông báo. Cảm nhận rung theo pattern và quan sát LED (nếu có).

Bật rung và đèn LED cho thông báo Android