Нито потребител 10056, нито текущият процес имат android.permission.MODIFY_PHONE_STATE

Искам да създам такова приложение, в което искам да отворя дайлер с определен номер по време на разговор.

Успешно отворих набирача по време на разговор с препратка към тази ВРЪЗКА, но не може да набере номера, а друг проблем е, че кодът не работи над 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)

Manifest.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