标签: android-broadcastreceiver

如何检查Receiver是否在Android中注册?

我需要检查我的注册接收者是否仍然注册,如果不是我如何检查任何方法?

api android broadcastreceiver android-broadcast android-broadcastreceiver

236
推荐指数
8
解决办法
12万
查看次数

android - "导出的接收器不需要许可",用于从系统服务接收的接收器

我在AndroidManifest中声明了一些接收器:

<!-- no warning -->
<receiver
    android:name=".receivers.TriggerMonitoringBootReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

<!-- no warning -->
<receiver
    android:name=".receivers.ScanResultsReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="android.net.wifi.SCAN_RESULTS" />
    </intent-filter>
</receiver>

<!-- warning : Exported receiver does not require permission-->
<receiver
    android:name=".receivers.BatteryMonitoringReceiver"
    android:enabled="false">
    <intent-filter>
        <action android:name="@string/intent_action_setup_alarm" />
        <action android:name="@string/intent_action_cancel_alarm" />
        <action android:name="@string/intent_action_monitor" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

第一个是为了接受一个BOOT_COMPLETED动作.第二个是接收android.net.wifi.SCAN_RESULTS.第三个是接收我广播的一些动作(intent_action_monitor)和AlarmManager(intent_action_setup_alarm等)广播的一些动作.

两个问题:

  • 为什么我没有收到所有接收器的警告?
  • 我需要为接收器设置哪些权限才能从系统服务接收以更正警告(我理解它是什么,我不希望任何人使用我的接收器)? exported="false" 的启动接收器,无线接收器,报警接收等
    我想过使用自定义权限,android:protectionLevel="signatureOrSystem"但文档建议不要使用此保护级别自定义权限.那我该如何处理这个警告呢?

将非常感谢链接到文档和/或一些代码.

android broadcastreceiver android-manifest android-permissions android-broadcastreceiver

61
推荐指数
4
解决办法
4万
查看次数

连接Wifi时,CONNECTIVITY_ACTION意图收到两次

在我的应用程序中,我有一个BroadcastReceiver通过<receiver>标签作为组件启动,过滤android.net.conn.CONNECTIVITY_CHANGE意图.

我的目标只是知道何时建立了Wifi连接,所以我在做的onReceive()是:

NetworkInfo networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
if(networkInfo.getType() == ConnectivityManager.TYPE_WIFI && networkInfo.isConnected()) {
    // Wifi is connected
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但在建立Wifi连接时,我似乎总是在大约一秒钟内得到两个相同的意图.我想看看任何信息,我可以从意图,获得ConnectivityManagerWifiManager,但我无法找到任何区别这两种意图.

查看日志,至少还有一个BroadcastReceiver也接收到两个相同的意图.

它运行在搭载Android 2.2的HTC Desire上

任何想法为什么我似乎在Wifi连接时获得"重复"的意图或两者之间的差异可能是什么?

android android-wifi android-broadcastreceiver

50
推荐指数
3
解决办法
5万
查看次数

Android中设备重启后广播接收器无法正常工作

我已经检查了所有相关问题,但没有找到解决此问题的任何方法.所以这对我来说是一个绝对新的问题.

是)我有的

我有一个Android应用程序,它在其清单中注册了几个广播接收器.这就是我的清单看起来的样子.

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

    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.USE_FINGERPRINT" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_CALL_LOG" />
    <uses-permission android:name="android.permission.WRITE_CALL_LOG" />
    <uses-permission android:name="com.android.vending.BILLING" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false" />

    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />

    <application
        android:name=".base.MyApp"
        android:allowBackup="false"
        android:icon="@drawable/ic_launcher"
        android:label="@string/label_app_name"
        android:largeHeap="true"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"
        tools:replace="label, allowBackup">

        <receiver android:name=".mics.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.QUICKBOOT_POWERON" />
            </intent-filter>
        </receiver>

        <receiver android:name=".PhoneCallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-broadcast android-broadcastreceiver

49
推荐指数
3
解决办法
2万
查看次数

Android O:PHONE_STATE广播限制

我一直在尝试做类似于truecaller应用程序的东西,我的应用程序应该在呼叫挂断后显示一个屏幕.通过android.intent.action.PHONE_STATEmanifest文件中注册隐式广播来实现这一点.

但是,如果我将应用程序更改为目标Android O,则无法正常工作,因为Android O广播限制,我正在尝试找出此用例的替代解决方案.

替代方案建议在Android的文档:Job scheduler或注册一个servicecontext.

作业调度程序:由于Job scheduler优化,接收回调会有一些延迟.因此,如果我们的应用程序屏幕在电话呼叫后几分钟显示,并且每隔几秒检查一次新的呼叫记录就会导致电池耗尽问题,这将影响用户体验.

在Java中使用上下文注册服务:即使应用程序未处于活动状态或活动状态,我也希望该行为能够正常工作.如果系统杀死了,这将无效Service.

注册前台服务:这需要一直向用户显示通知,这将是用户的垃圾邮件,并且全天候运行服务会消耗大量资源,这会破坏广播限制的整个目的.

请建议一个替代解决方案,以便用户体验保持不变.

提前致谢

performance android android-broadcast android-broadcastreceiver android-8.0-oreo

34
推荐指数
1
解决办法
1290
查看次数

具有boot_completed的运行时异常Android O.

我正在尝试在我的BOOT_COMPLETED接收器中启动一个IntentService,但在Android O(API 26)中,我得到:

java.lang.RuntimeException: 
java.lang.IllegalStateException: 
Not allowed to start service Intent { act=intent.action.update cmp=packageName.services.OwnService }: 
app is in background
Run Code Online (Sandbox Code Playgroud)

(消息在一行中,但这样更易读)

我怎么能以正确的方式做到这一点?

android bootcompleted android-broadcastreceiver android-8.0-oreo

28
推荐指数
1
解决办法
9155
查看次数

如何保持我的BroadcastReceiver

目前我正在开发一个类似Truecaller的呼叫拦截器应用程序.

我需要什么

即使我的应用程序已从最近的应用程序列表中删除,我也想检测来电.

Manifest.xml代码

<receiver android:name=".PhoneStateReceiver">
        <intent-filter>
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

我的广播接收器代码

@Override
public void onReceive(Context context, Intent intent) {
  //my call blocking code
}
Run Code Online (Sandbox Code Playgroud)

我的问题

我的BroadcastReceiver不会在后台工作,就像我从最近的应用列表中删除一样.

我的完整清单代码在这里

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ranjith.callblocker">

<uses-permission android:name="android.permission.READ_PHONE_STATE" />

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<uses-permission android:name="android.permission.GET_TASKS" />

<application
    android:allowBackup="true"
    android:enabled="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <receiver
        android:name=".PhoneStateReceiver"
        android:enabled="true"
        android:exported="true"
        android:process=":anotherProcess">
        <intent-filter android:priority="1000">
            <action android:name="android.intent.action.PHONE_STATE" />
        </intent-filter>
    </receiver>
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application> …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-service android-broadcastreceiver

20
推荐指数
1
解决办法
5289
查看次数

致命异常:android.app.RemoteServiceException:无法在android.os.Handler.dispatchMessage上传递广播

我在我的Android应用程序上使用广播消息(从io.socket我发送广播消息到我的活动页面).在某些设备上,三星SM-G950FSM-A520F出现错误" Fatal Exception: android.app.RemoteServiceException: can't deliver broadcast".我在Fabric crashlytics上遇到此错误,但我无法重现此问题.这是我从Fabric获得的日志,

   Fatal Exception: android.app.RemoteServiceException: can't deliver broadcast
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1813)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:154)
   at android.app.ActivityThread.main(ActivityThread.java:6776)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
Run Code Online (Sandbox Code Playgroud)

java android broadcastreceiver android-broadcast android-broadcastreceiver

18
推荐指数
2
解决办法
7729
查看次数

android GoogleAuthUtil.getTokenWithNotification Intent回调未触发

我有一个后台服务,调用GoogleAuthUtl.getTokenWithNotification它,它正常工作,但我正在尝试实现此功能的回调部分,但是无法正常工作.

我已经实现了一个广播接收器并将其添加到清单中,我的应用程序中也有一个活动.以下是相关的代码段.

GoogleAuthUtil.getTokenWithNotification

GoogleAuthUtil.getTokenWithNotification(this.getContext(), account, "oauth2:" + GmailScopes.GMAIL_SEND, null, new Intent(AuthReceiver.AUTH_INTENT));
Run Code Online (Sandbox Code Playgroud)

AuthReceiver

public class AuthReceiver extends BroadcastReceiver
{
    public final static String AUTH_INTENT = "com.testoauth.AUTH_INTENT";

    public AuthReceiver()
    {
    }

    @Override
    public void onReceive(Context context, Intent intent)
    {
        Log.d("RECEIVER", "Received Auth broadcast.");
        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.cancelAll();
    }
}
Run Code Online (Sandbox Code Playgroud)

AndroidManifest

<receiver android:name=".AuthReceiver" android:enabled="true" android:exported="true">
    <intent-filter>
        <action android:name="com.testoauth.AUTH_INTENT" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

我不知道为什么它没有收到广播.我没有在日志中看到任何异常,并且没有任何迹象表明接收器完全被调用,它在调试时甚至不会在断点处中断.我做错了什么吗?

编辑

我正在使用min sdk 16和目标sdk 25

GoogleAuthUtil.getTokenWithNotification API文档中:

此方法专门用于后台任务.如果出现需要用户干预的错误,此方法负责推送相关通知.在用户解决通知之后,广播回叫.如果用户取消,则不会触发回调.

无论用户是否取消,都不会触发回调.除了ActivityManager显示通知(Displayed com.google.android.gms/.auth.uiflows.gettoken.GetTokenActivity)的说法之外,没有迹象表明com.testoauth.AUTH_INTENT已经在日志中发送了指定的广播意图(在这种情况下)."收到的Auth广播".日志中也没有消息.

包含此功能( …

android google-authentication google-play-services google-oauth android-broadcastreceiver

17
推荐指数
1
解决办法
786
查看次数

WakefulBroadcastReceiver已弃用

为了创建一个接收器,我WakefulBroadcastReceiver在我的旧项目中进行了扩展.但现在是deprecated.而不是WakefulBroadcastReceiverReceiver,我应该现在使用以及如何将下面的代码转换的新方法?

这是我的代码:

 public class TaskFinishReceiver extends WakefulBroadcastReceiver {
    private PowerManager mPowerManager;
    private PowerManager.WakeLock mWakeLock;
    @Override
    public void onReceive(Context context, Intent intent) {
        mPowerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        turnOnScreen();
        Intent wakeIntent = new Intent();

        wakeIntent.setClassName("com.packagename", "com.packagename.activity.TaskFinished");
        wakeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(wakeIntent);
    }


    public void turnOnScreen(){
        mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag");
        mWakeLock.acquire();
    }
}
Run Code Online (Sandbox Code Playgroud)

android receiver powermanager android-broadcastreceiver

17
推荐指数
2
解决办法
1万
查看次数