在Android 9 Pie中以编程方式终止电话时,“ java.lang.SecurityException:需要MODIFY_PHONE_STATE权限”

时间:2019-07-16 06:29:37

标签: java android android-phone-call

我想以编程方式在android 9 pie中取消通话。

我使用了此代码,但仅适用于Oreo。它不适用于馅饼

public static boolean killCall(Context context) {
        try {
            System.out.println("Kill called");

            // Get the boring old TelephonyManager
            TelephonyManager telephonyManager =
                    (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

            // Get the getITelephony() method
            Class classTelephony = Class.forName(telephonyManager.getClass().getName());
            Method methodGetITelephony = classTelephony.getDeclaredMethod("getITelephony");

            // Ignore that the method is supposed to be private
            methodGetITelephony.setAccessible(true);

            // Invoke getITelephony() to get the ITelephony interface
            Object telephonyInterface = methodGetITelephony.invoke(telephonyManager);

            // Get the endCall method from ITelephony
            Class telephonyInterfaceClass =
                    Class.forName(telephonyInterface.getClass().getName());
            Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");

            // Invoke endCall()
            methodEndCall.invoke(telephonyInterface);
            System.out.println("Killed");
            inCall = false;



        } catch (Exception ex) { // Many things can go wrong with reflection calls
            ex.printStackTrace();
            Log.d(TAG, "PhoneStateReceiver **" + ex.toString());
            System.out.println("Error");
            return false;
        }
        return true;
    }

在android pie上运行时会出现此错误。任何人都可以建议我和其他方法来终止通话。

  

W / System.err:java.lang.reflect.InvocationTargetException           在java.lang.reflect.Method.invoke(本机方法)W / System.err:在   com.hunteralex.autodialer.PhoneStateReceiver.killCall(PhoneStateReceiver.java:122)           在com.hunteralex.autodialer.AutoRedialerService $ 1 $ 1.run(AutoRedialerService.java:97)           在android.os.Handler.handleCallback(Handler.java:873)           在android.os.Handler.dispatchMessage(Handler.java:99)           在android.os.Looper.loop(Looper.java:193)           在android.app.ActivityThread.main(ActivityThread.java:6669)           在java.lang.reflect.Method.invoke(本机方法)           在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:493)   W / System.err:位于   com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)       引起原因:java.lang.SecurityException:需要MODIFY_PHONE_STATE权限。           在android.os.Parcel.createException(Parcel.java:1942)           在android.os.Parcel.readException(Parcel.java:1910)W / System.err:在android.os.Parcel.readException(Parcel.java:1860)           在com.android.internal.telephony.ITelephony $ Stub $ Proxy.endCall(ITelephony.java:2249)         ...还有10个

2 个答案:

答案 0 :(得分:0)

MODIFY_PHONE_STATE 是仅系统权限,您可以启动设备并将其放在/ system / priv-app文件夹中。但是,还有其他方法可以解决您的问题。您到底想在这里实现什么?

看看here

MODIFY_PHONE_STATE是仅限系统的权限,因此不允许应用程序获取它。

这可能与平台的早期版本有所不同,但这没关系,因为它仅保护私有API,因此,如果您执行要求这样做的事情,则使用的是不支持的私有API,这会导致某些问题就像您的应用程序在不同版本的平台上崩溃一样。

您包含的堆栈抓取尚未完成,因此无法告诉您您实际上在做什么。

答案 1 :(得分:0)

cantona_7提到MODIFY_PHONE_STATE是仅限系统的权限,没有root用户访问权限就无法访问它,也没有解决方法可以终止从Pie开始的呼叫。

如官方网站所述:

  

MODIFY_PHONE_STATE   在API级别1中添加   公共静态最终字符串MODIFY_PHONE_STATE

     

允许修改电话状态-开机,mmi等。不包括拨打电话。

     

不供第三方应用程序使用。