如何在我的服务类中注册广播接收器?

时间:2021-05-11 02:26:01

标签: android broadcastreceiver android-service smsmanager android-vibration

我正在尝试在后台读取收到的短信,并在收到短信时将设备振动 20 秒。我正在为此目的实现 service 类:

public class Ringer_modifier extends Service {

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();

        SMSreceiver mSmsReceiver = new SMSreceiver();
        IntentFilter filter = new IntentFilter();
        filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);
        filter.addAction("android.provider.Telephony.SMS_RECEIVED"); // SMS
        this.registerReceiver(mSmsReceiver, filter);

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        SMSreceiver mSmsReceiver = new SMSreceiver();
        unregisterReceiver(mSmsReceiver);
        super.onDestroy();
    }

    static class SMSreceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                Vibrator v = (Vibrator) context.getSystemService(VIBRATOR_SERVICE);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    v.vibrate(VibrationEffect.createOneShot(20000, VibrationEffect.DEFAULT_AMPLITUDE));
                } else {
                    v.vibrate(20000);
                }
            }
        }
    }
}

我从这样的活动中调用这个 service 类:

<块引用>

startService(new Intent(this, Ringer_modifier.class));

但是我的广播接收器既不读取传入的消息也不振动。我在这里做错了什么?我的 targetsdkversion 是 29。

我还在清单文件中包含了这些权限:

<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.VIBRATE" />

编辑:我的 logcat 一直显示我的广播接收器未注册。

2021-05-11 08:06:21.437 1335-1335/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.savior, PID: 1335
    java.lang.RuntimeException: Unable to stop service com.example.savior.Ringer_modifier@a179014: java.lang.IllegalArgumentException: Receiver not registered: com.example.savior.Ringer_modifier$SMSreceiver@8da36b2
        at android.app.ActivityThread.handleStopService(ActivityThread.java:4481)
        at android.app.ActivityThread.access$2000(ActivityThread.java:252)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2124)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:238)
        at android.app.ActivityThread.main(ActivityThread.java:7878)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:512)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)
     Caused by: java.lang.IllegalArgumentException: Receiver not registered: com.example.savior.Ringer_modifier$SMSreceiver@8da36b2
        at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1519)
        at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1570)
        at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:675)
        at com.example.savior.Ringer_modifier.onDestroy(Ringer_modifier.java:50)

0 个答案:

没有答案