【问题标题】:Neither user 10056 nor current process has android.permission.MODIFY_PHONE_STATE用户 10056 和当前进程都没有 android.permission.MODIFY_PHONE_STATE
【发布时间】:2014-01-09 12:14:57
【问题描述】:

我想创建这样一个应用程序,我想在通话过程中打开一个指定号码的拨号器。

我在通话过程中成功打开了拨号器,使用此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)

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

编辑

我可以在所有设备上自动接听电话,但只能打开拨号盘。

【问题讨论】:

  • 请您告诉我如何以编程方式接听电话,我希望它以编程方式接听,但我不知道该怎么做

标签: android phone-call telephonymanager


【解决方案1】:

删除此行,您的代码应该可以工作:

telephonyService.silenceRinger();

这是Android 2.2之后的无效调用。

【讨论】:

    【解决方案2】:

    你试过像下面这样吗?

    Intent intent = new Intent(Intent.ACTION_DIAL);
    intent.setData(Uri.parse("tel:1231231234"));
    startActivity(intent);
    

    【讨论】:

    • 它将发出新的呼叫
    • 那你的要求是什么?
    • 想在通话中发送DTMF
    • 据我所知,您不允许这样做。您在上面的代码中尝试做的是缺乏黑客攻击而不是标准的做法。
    • 我想开发像回调这样的功能,那么具体的流程是什么?或者它在 Android 中是不可能的?
    【解决方案3】:

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

    【讨论】:

    • 我可以在所有设备上接听电话,但只能打开拨号盘。
    • @user543: 不行,有没有其他办法可以接电话
    【解决方案4】:

    添加清单权限MODIFY_PHONE_STATE

    【讨论】:

    • 请查看LinkMODIFY_PHONE_STATE 不能被 3rd 方应用使用。
    • MODIFY_PHONE_STATE 是仅适用于系统应用的私有权限
    【解决方案5】:

    我知道你使用了隐藏库 com.android.internal.telephony 我在清单中添加了这一行

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

    我在我的案例中工作过,我在 4.4.2 中尝试过

    【讨论】:

    • 不能添加,说这个权限只授予系统应用。
    猜你喜欢
    • 2015-10-09
    • 2019-01-09
    • 2018-03-21
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多