2015-08-25 56 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

該應用程序可能沒有「手機」的權限,要麼在運行時詢問權限,要麼進入應用程序設置並啓用應用程序所要求的所有權限。
這對我有效..