2017-02-22 20 views
0

Я хочу получить номер вызываемого абонента в андроиде, но когда я запускаю исходящий вызов, он не работает. Я использую широковещательный приемник и зарегистрирую его в сервисе, чтобы продолжать слушать, если активность не в фокусе здесь - это мой код.Получение вызова в широковещательном приемнике

Menifest.xml

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

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" > 
    <activity android:name=".MainActivity" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
      <action android:name="android.intent.action.BOOT_COMPLETED"> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 


      </action> 
     </intent-filter> 
    </activity> 

    <service android:name=".MyService" /> 


    <receiver 
     android:name="com.example.vampirepc.androidservice.OutgoingReceiver" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
     </intent-filter> 
    </receiver> 

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

BroadcastReceiver Класс

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

    Toast.makeText(ctx, 
      "Inside broadcast", 
      Toast.LENGTH_LONG).show(); 


    String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 

    Toast.makeText(context, "Outgoing call catched: " + phoneNumber, Toast.LENGTH_LONG).show(); 


} 

Сервис

@Override 
public void onCreate() { 
    Toast.makeText(getApplicationContext(),"Service created",Toast.LENGTH_SHORT).show(); 

    try { 


     IntentFilter filter = new IntentFilter("android.intent.action.NEW_OUTGOING_CALL"); 

     OutgoingReceiver myReceiver = new OutgoingReceiver(); 
     registerReceiver(myReceiver, filter); 


    } catch (Exception e) { 

     Toast.makeText(getApplicationContext(),"Exception is "+String.valueOf(e),Toast.LENGTH_SHORT).show(); 

    } 



} 
+1

Нет необходимости регистрировать приемник во время выполнения в вашем случае, просто определите его внутри манифеста. –

+0

По-прежнему не работает, когда я набираю номер. Приложение перестало работать. – DumpsterDiver

+1

Пожалуйста, разместите трассировку стека. –

ответ

0

Пожалуйста, добавьте разрешение в верхней части, это помогло мне

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

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

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" > 
     <activity android:name=".MainActivity" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
       <action android:name="android.intent.action.BOOT_COMPLETED"> 
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 


       </action> 
      </intent-filter> 
     </activity> 
     <receiver 
      android:name="com.example.vampirepc.androidservice.OutgoingReceiver" 
      android:enabled="true" 
      android:exported="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
      </intent-filter> 
     </receiver> 

    <service android:name=".MyService" /> 
    </application> 
    <uses-permission 
    </manifest> 
+0

См. Эту ссылку https://www.simplifiedcoding.net/android-studio-tutorial-an-app-to-track-outgoing-calls/ –

0

Вы поняли, в этой строке:

Toast.makeText(ctx, 
     "Inside broadcast", 
     Toast.LENGTH_LONG).show(); 

Вы использовали CTX вместо контекста.

0

Благодарим всех, что я решил проблему. Я сам использовал неправильный контекст в тостерах, это правильный метод onReceive. Я использовал ctx, который был инициализирован.

Context ctx; 


    public void onReceive(Context context, Intent intent) { 

    Toast.makeText(context, "this is not shown"  , Toast.LENGTH_LONG).show(); 



    String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER); 

    Toast.makeText(context, "Outgoing call catched: " + phoneNumber, Toast.LENGTH_LONG).show(); 


}