2016-08-10 3 views
4

BroadcastReceiverを使用して着信を取得すると、電話番号を記録しようとしています。しかし、私は自分の番号にダイヤルするときにlogを取得しません。これはコードである:BroadcastReceiver [Marshmallow]を使用して着信番号を検出することができません

のAndroidManifest.xml

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

    <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" > 

     <receiver android:name=".MyPhoneReceiver" > 
      <intent-filter> 
       <action android:name="android.intent.action.PHONE_STATE" > 
       </action> 
      </intent-filter> 
     </receiver> 
     <activity android:name=".MainActivity" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

MainActivity.java

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Intent intent = new Intent("tuet"); 
     sendBroadcast(intent); 
    } 
} 

MyPhoneReceiver.java

public class MyPhoneReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Bundle extras = intent.getExtras(); 
     if (extras != null) 
     { 
      String state = extras.getString(TelephonyManager.EXTRA_STATE); 

      if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) { 
       String phoneNumber = extras 
         .getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
       Log.e("DEBUG", phoneNumber); 
      } 
     } 
    } 
} 

SDK 23を使用してコンパイルしていますが、ターゲットがMarshmallowであっても、この場合は実行時アクセス許可を使用する必要がありますか?または私は何かを逃している?

EDIT-1

私は、ターゲットSDKのバージョンをダウングレードするときに問題にのみ、以降マシュマロと関連しているように思える、これは正常に動作している:targetSdkVersion 22

SDK23以降でこれを調整するにはどうすればいいですか?

+0

ごとにAPI 23以上を対象とする場合requested at runtimeでなければならないことはキットカットでこの動作していることをdangerous permissionありますか? –

+0

していない!最初の前提として、コードにいくつか間違いがありますが、私はlogcatでも警告を受け取っていません! – OBX

答えて

2

着信電話番号。アプリケーションにREAD_PHONE_STATE権限がない場合、空の文字列が引数として渡されます。

そしてREAD_PHONE_STATEあなたはMarshmallow Behavior Changes

0

あなたのonReceive方法でこのスニペットを試してみてください:

@Override 
    public void onReceive(final Context context, Intent intent) { 
     TelephonyManager telephony = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE); 
     telephony.listen(new PhoneStateListener(){ 
      @Override 
      public void onCallStateChanged(int state, String incomingNumber) { 
       super.onCallStateChanged(state, incomingNumber); 
       Log.e("DEBUG", incomingNumber); 
      } 
     },PhoneStateListener.LISTEN_CALL_STATE); 
    } 

参考:マニフェストに

https://stackoverflow.com/a/13154533/2724418

+0

動作しません! .. – OBX

+0

あなたのonReceiveメソッドにブレークポイントを設定して、それがまったく呼び出すのを確認しますか? –

0

これを試してみてください

<receiver android:name=".PhoneCallReceiver"> 
     <intent-filter> 
      <action android:name="android.intent.action.PHONE_STATE" /> 
     </intent-filter> 
    </receiver> 

をPhoneCallReceiverで:

public void onReceive(Context context, Intent intent) { 
    try { 
     if (intent.getAction().equals("android.intent.action.PHONE_STATE")) 
     { 
      String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE); 
      if(state.equals(TelephonyManager.EXTRA_STATE_RINGING)) 
      { 
       TelephonyManager tmgr = (TelephonyManager) context 
         .getSystemService(Context.TELEPHONY_SERVICE); 




       Bundle bundle = intent.getExtras(); 
       String phoneNumber = bundle.getString(TelephonyManager.EXTRA_INCOMING_NUMBER); 
       Log.d("INCOMING", phoneNumber); 

      } 
     } 
    } catch (Exception e) { 
     Log.e("Phone Receive Error", " " + e); 
    } 
} 
+0

Marshmallow以降では、android.permission.READ_PHONE_STATE権限を付与する必要があります。あなたはアプリの設定からそれを与えることによってそれをテストすることができます。それは私のために働いている –

1

許可の問題です。 Marshmallowでは、アプリがSDK 23をターゲットにしている場合、実行時にパーミッションを処理します。https://developer.android.com/training/permissions/requesting.htmlを参照してください。これをテストするには、システム設定でアプリケーションに必要なすべての権限を手動で有効にして、アプリが機能するようにします。 onCallStateChanged() documentationパー