Невозможно определить номер входящего звонка, используя BroadcastReceiver [ Marshmallow]
Я пытаюсь записать номер телефона, когда получаю входящий звонок, используя BroadcastReceiver
, Однако я не получаю никаких log
когда я наберу свой номер. Это код:
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
Похоже, что проблема связана только с Marshmallow и далее, когда я понизил целевую версию SDK, это работает нормально: targetSdkVersion 22
,
Итак, как настроить это для работы в SDK23+ и далее?
4 ответа
В соответствии с документацией onCallStateChanged():
телефонный номер входящего вызова. Если приложение не имеет
READ_PHONE_STATE
разрешение, пустая строка будет передана в качестве аргумента.
А также READ_PHONE_STATE
является опасным разрешением, которое необходимо запрашивать во время выполнения, когда вы выбираете API 23 или выше в соответствии с изменениями поведения Зефира
Это вопрос разрешения. В Marshmallow вы имеете дело с разрешениями во время выполнения, если ваше приложение предназначено для SDK 23. См. https://developer.android.com/training/permissions/requesting.html. Вы можете проверить это, вручную включив все разрешения, необходимые вашему приложению в Системных настройках, и тогда ваше приложение будет работать.
Попробуй это:
В Манифесте:
<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);
}
}
Попробуйте этот фрагмент в вашем методе 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);
}
Ссылка: /questions/41211492/kak-poluchit-nomer-telefona-pri-vhodyaschem-zvonke/41211511#41211511