【问题标题】:OnReceive call not working AndroidOnReceive 呼叫无法正常工作 Android
【发布时间】:2014-04-13 11:56:56
【问题描述】:

我有一个类,代码如下:

public class CallManager extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        tManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        Log.i("onReceive","here");
    }
}

清单上的权限:

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

接收者意图过滤器:

<receiver android:name="com.ram.tapdetector.CallManager">
    <intent-filter> 
        <action android:name="android.intent.action.BOOT_COMPLETED" /> 
    </intent-filter>
 </receiver>

由于某种原因,onReceive 函数没有记录任何内容?

我该如何解决这个问题?任何帮助将不胜感激,谢谢。

【问题讨论】:

  • 我假设您的应用中有Activity,并且您至少启动过一次?
  • 是的,我的申请符合所有条件
  • @rohfosho,你和纳什到底想检测什么动作?在上一篇文章中,它说“查看我的手机何时被调用”。
  • 是的,当手机接听电话时,应该执行onReceive()函数。 @MikeM。
  • @rohfosho:再想一想——你的应用程序安装在 SD 卡上了吗?如果是这样,它将永远不会收到广播。原因是BOOT_COMPLETED广播是在SD卡挂载之前发送的。

标签: java android broadcastreceiver function-calls phone-call


【解决方案1】:

您的 AndroidManifest.xml 文件中需要以下内容:

1) 在你的元素中:

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

2) 在您的元素中(确保为您的 BroadcastReceiver 使用完全限定的 [或相对] 类名):

<receiver android:name="com.example.CallManager">  
    <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>  
</receiver>

` 在 MyBroadcastReceiver.java 中:

`    package com.example;

public class CallManager extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        tManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        Log.i("onReceive","here");
    }
    }`

如果您使用的是 HTC 手机-

随着

`<action android:name="android.intent.action.BOOT_COMPLETED" />  `

也使用,

`<action android:name="android.intent.action.QUICKBOOT_POWERON" />`

HTC 设备似乎无法捕获 BOOT_COMPLETED

【讨论】:

  • 我已经使用了所有这些东西,但应用程序无法正常工作。我需要服务才能使用它吗?或者没有它可以工作吗?
  • 一个问题,你用什么手机来测试它?将您的代码发布到 pathak.ims@gmail.com,我会调查并解决您的问题。
【解决方案2】:

你必须添加权限

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

而不是

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

BOOT_COMPLETED。查看文档here

据我所知,其他一切都应该没问题。

p.s.:如果您想接收来电的广播事件,请使用权限

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

并使用

声明您的意图过滤器
<receiver 
  android:name="com.ram.tapdetector.CallManager"
  android:enabled="true">   
    <intent-filter
      android:priority="1000">
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>

查看这个漂亮的tutorial 了解更多信息。

【讨论】:

  • 在此之后仍然没有调用 onReceive 函数?
  • 亲爱的 rohfosho,您能否提供更多围绕您的 CallManager 类的代码。我所追求的是,​​也许你的包名有错字,或者你的类是一个嵌套类。嵌套类必须是静态的,您需要在清单中声明它们略有不同。 p.s.请参阅上面的评论。来电接收者。
  • 代码基本上在那里^我想检测何时接到电话,我希望能够接听/拒绝电话。但是无论如何都不会调用 onRecieve 函数。
  • @rohfosho:我看不到你的包声明,也看不到CallManager 是否是一个嵌套类。这可以产生很大的不同;)......好吧,除此之外:添加标签android:enabled="true"以确保接收器在所有平台上都可用并添加优先级,例如android:priority="1000" 可能是默认优先级不够高或其他应用程序(例如,环聊非常贪婪:它使用 MAXINT 发送短消息)。请参阅上面的更新....如果这不起作用,我只能想到固件问题。您使用自定义 ROM 吗?
【解决方案3】:

您是否尝试过使用标志:

android:enabled="true" 
android:exported="true" 

?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    • 2012-09-13
    • 2012-03-24
    • 2012-11-03
    • 2013-11-24
    相关资源
    最近更新 更多