2015-08-25 55 views
9

我已经创建了一个合适的BoradcastReceiver,在Manifest.xml中注册了它,这里是我的问题:如果我的应用程序已经启动并挂在后台,拨打号码会将其置于前面。如果尚未启动,则拨打号码将不起作用。
我该如何解决这个问题?如果这一点很重要,我会用MIUI6对小米Mi4进行测试。通过拨打号码发起活动

下面的代码(我用的Scala):

的manifest.xml:

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 
... 
<receiver android:name="DialerGate" android:enabled="true" android:exported="true"> 
      <intent-filter android:priority="1"> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 
      </intent-filter> 
     </receiver> 

广播接收器:

class DialerGate extends BroadcastReceiver { 
    def onReceive(context: Context, intent: Intent) = 
    if (intent.getAction equals Intent.ACTION_NEW_OUTGOING_CALL) { 
     val phoneno = intent.getExtras getString Intent.EXTRA_PHONE_NUMBER 
     val prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE) 
     val number = prefs.getString(AbstractKit.LAUNCH_NUMBER, null) 

     Log.d("WALLET-PHONE", s"Dialed number: $phoneno, saved number: $number") 
     Log.d("WALLET-PHONE-OK", (number == phoneno).toString) 

     val i = new Intent 
     i.setClassName("com.app.wallet", "com.app.wallet.MainActivity") 
     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP) 

     val appContext = context.getApplicationContext 
     appContext.startActivity(i) 


     //if (number == phoneno) context startActivity new Intent(context, target) 
     //context stopService intent 
    } 
} 
+0

难道你不能让你的应用程序在启动时运行吗? http://stackoverflow.com/questions/10428510/how-to-start-launch-application-at-boot-time-android/10428665#10428665 – JesterXiii

+0

@JesterXiii,不,这不是我想要的。我的目标是启动拨打特定号码的应用程序。 – Anton

+0

@Anton当他们在Manifest中注册时,广播的工作方式是,如果它没有运行,它们将被调用来唤醒进程。 – JoxTraex

回答

5

从一个简单的用户的角度来看,这是不能做(它的一个安全功能)。

从蜂巢的Android开始,直到应用程序运行至少一次不允许调用任何广播接收机。

它基本上更简单,让程序中(引导其最常见的期间)中至少运行一次,然后有意向关闭应用程序如果没有时间来使用它。

Check this for further details关于如何执行额外的接收器,可能你需要它做什么。

+0

嗯,这不是我遇到的问题,因为我在拨打号码前多次启动应用程序。 – Anton

+0

@Anton只是一些细节......我没有使用def,而是preffer使用完整的@Override public void onReceive(Context c,Intent i){stuffs()}'版本,因为这会更容易遵循关于程序更新......另外,你的代码中充斥着“拼写错误”......因为几乎没有';',并且没有函数调用函数'val i = new Intent'不是java .. ..'int i = new Intent();'可能是 – Bonatti

+0

对不起,我忘了提及我使用Scala。我刚更新了这篇文章。 – Anton

1

看一看here。 您可能会使用服务,但只关心一件事:当应用程序关闭时,服务也会关闭,因为它们位于一个线程中,所以服务应该位于另一个线程上,以便它不会被关闭。 您可以使用AlarmManager保持活动状态。 在链接也有一些样品:)

希望它能帮助!

+0

这是不正确的先生,服务不依赖于活动的生命周期,这意味着除非你明确地把它杀死。 – Elltz

2

在广播接收器建立一个监听器,听ON_BOOT_COMPLETED,然后开始你的应用程序,在无声的情绪,你会被解析到你的正常运作。

注意事项如果要以这种方式唤醒活动,那么键盘记录应用程序和黑客应用程序将非常非常便宜地创建 - 因此会使android易受攻击。

+0

换句话说,如果它没有挂在背景中,那么不启动应用程序的这种行为是通过设计的? – Anton

2

http://android-developers.blogspot.in/2013/05/handling-phone-call-requests-right-way.html

监听呼出请求

应用提供电话呼叫服务(如VoIP或数量管理)可以设置意图过滤器来处理呼出呼叫请求,如那些从制成拨号程序或其他已安装的应用程序。这为用户提供了无缝集成,用户可以直接转到呼叫服务,而无需重拨或启动其他应用。

当用户发起呼叫时,系统通过发送NEW_OUTGOING_CALL意图的有序广播,将原始电话号码,URI和其他信息附加为附加信息来通知感兴趣的应用程序。这使得Google Voice等应用可以在通话到系统的默认电话应用之前修改,重新路由或取消通话。

如果您希望您的电话呼叫应用能够处理呼出呼叫请求,请实施收到NEW_OUTGOING_CALL Intent的广播接收器,处理该号码并根据需要发起呼叫。确保在接收器中为NEW_OUTGOING_CALL声明一个意图过滤器,让系统知道您的应用程序对广播感兴趣。您还需要请求PROCESS_OUTGOING_CALLS权限才能接收意图。

请注意,系统仅针对与核心拨号功能(例如紧急号码)无关的号码广播NEW_OUTGOING_CALL。这意味着NEW_OUTGOING_CALL不能以您使用CALL_PRIVILEGED的方式干扰对紧急服务的访问。

下面是一个应用程序的清单文件中声明的例子广播接收器:

<manifest> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    <application> 
     ... 
     <receiver android:name=MyOutgoingCallHandler"> 
      <intent-filter> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </receiver> 
     ... 
    </application> 
</manifest> 

而且我相信<category android:name="android.intent.category.DEFAULT" />会做的伎俩为您服务。查看这个问题了解更多关于类别标签的细节。 here

+0

不幸的是,添加类别标签根本没有任何效果。 – Anton

+0

将优先级提高到2147483647 –

2

您可以尝试几件事。

尝试使用java,如果不尝试以下操作。

<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/> 
... 
<receiver android:name="DialerGate"> 
     <intent-filter android:priority="2147483648"> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL"/> 
     </intent-filter> 
    </receiver> 

更改优先级并删除不必要的东西。

虽然我擅长广播接收器,但我没有Scala的经验,所以我只能提出一些想法。删除if声明。这不是必需的,因为您已经拥有<intent-filter>。同样在paste bin代码中改变意图。

0

该应用程序可能没有“手机”的权限,要么在运行时询问权限,要么进入应用程序设置并启用应用程序所要求的所有权限。
这对我有效..