Ни пользователь 10056, ни текущий процесс не имеют android.permission.MODIFY_PHONE_STATE

Я хочу создать такое приложение, в котором я хочу открыть номеронабиратель с указанным номером во время звонка.

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

Код:

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
ITelephony telephonyService;
telephonyService = (ITelephony)m.invoke(tm);

// Silence the ringer and answer the call!
telephonyService.silenceRinger();
telephonyService.answerRingingCall();
telephonyService.showCallScreen();
telephonyService.showCallScreenWithDialpad(true);

ЖУРНАЛ ОШИБОК:

01-09 17:35:41.065: W/Resources(367): Converting to string: TypedValue{t=0x10/d=0x2 a=-1}
01-09 17:38:23.446: W/System.err(367): java.lang.SecurityException: Neither user 10056 nor current process has android.permission.MODIFY_PHONE_STATE.
01-09 17:38:23.446: W/System.err(367):  at android.os.Parcel.readException(Parcel.java:1322)
01-09 17:38:23.446: W/System.err(367):  at android.os.Parcel.readException(Parcel.java:1276)
01-09 17:38:23.446: W/System.err(367):  at com.android.internal.telephony.ITelephony$Stub$Proxy.silenceRinger(ITelephony.java:549)
01-09 17:38:23.446: W/System.err(367):  at com.everysoft.autoanswer.AutoAnswerIntentService.answerPhoneAidl(AutoAnswerIntentService.java:137)
01-09 17:38:23.446: W/System.err(367):  at com.everysoft.autoanswer.AutoAnswerIntentService.onHandleIntent(AutoAnswerIntentService.java:94)
01-09 17:38:23.446: W/System.err(367):  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59)
01-09 17:38:23.446: W/System.err(367):  at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 17:38:23.446: W/System.err(367):  at android.os.Looper.loop(Looper.java:123)
01-09 17:38:23.446: W/System.err(367):  at android.os.HandlerThread.run(HandlerThread.java:60)

Манифест.xml

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

ИЗМЕНИТЬ

Я могу автоматически отвечать на вызовы на всех устройствах, но у меня проблема только с открытием панели набора номера.


person Juned    schedule 09.01.2014    source источник
comment
пожалуйста, не могли бы вы сказать мне, как вы можете программно ответить на телефонный звонок, я хочу, чтобы он ответил программно, но я не знаю, как это сделать   -  person Pir Fahim Shah    schedule 27.07.2015


Ответы (5)


Удалите эту строку, и ваш код должен работать:

telephonyService.silenceRinger();

Это недопустимый вызов после Android 2.2.

person Jim    schedule 17.01.2014

Вы пробовали, как показано ниже?

Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel:1231231234"));
startActivity(intent);
person CR Sardar    schedule 20.01.2014
comment
он сделает новый вызов - person Juned; 20.01.2014
comment
тогда каково ваше требование? - person CR Sardar; 20.01.2014
comment
хотите отправить DTMF во время разговора - person Juned; 20.01.2014
comment
Насколько я знаю, тебе не разрешено это делать. То, что вы пытаетесь сделать в приведенном выше коде, не является стандартным способом взлома. - person CR Sardar; 20.01.2014
comment
Я хочу разработать такую ​​​​функцию, как обратный вызов, так каков будет точный процесс для этого? или это невозможно в Android? - person Juned; 20.01.2014

Разрешение MODIFY_PHONE_STATE используется только системными приложениями, а не сторонними приложениями.

Вместо использования answerRingingCall() вы можете использовать ключевые события, такие как:

Intent buttonDown = new Intent(Intent.ACTION_MEDIA_BUTTON);
buttonDown.putExtra(Intent.EXTRA_KEY_EVENT, 
new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(buttonDown, "android.permission.CALL_PRIVILEGED");
person user543    schedule 09.01.2014
comment
Я могу ответить на звонок на всех устройствах, но проблема только с открытием панели набора номера. - person Juned; 09.01.2014
comment
@ user543: Не работает, есть ли другое решение для приема вызова? - person Vineesh TP; 08.05.2017

Добавить в манифест разрешение MODIFY_PHONE_STATE

person PsyGik    schedule 09.01.2014
comment
Пожалуйста, проверьте эту ссылку. MODIFY_PHONE_STATE не может использоваться сторонними приложениями. - person PsyGik; 10.01.2014
comment
MODIFY_PHONE_STATE — это частное разрешение, доступное только для системных приложений. - person Antroid; 14.05.2018

Я думаю, вы используете скрытую библиотеку com.android.internal.telephony. Я добавляю эту строку в манифест

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

и у меня сработало в моем случае пробовал в 4.4.2

person Badr4si    schedule 24.12.2014
comment
не могу его добавить, говорит, что это разрешение предоставляется только системным приложениям. - person Silvia H; 14.03.2015