当前位置: 首页 > 知识库问答 >
问题:

“java.lang.SecurityException:在android 9中以编程方式终止电话时需要修改\电话\状态权限”

解晟
2023-03-14

我想在android 9 pie中以编程方式终止一个呼叫。

我使用了这个代码,但它只对奥利奥有效。这不适合做馅饼

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/系统。错误:java。朗。反思。java上的InvocationTargetException。朗。反思。方法使用系统调用(本机方法)。错误:在com上。亨特拉克斯。自动拨号器。电话接收器。com上的killCall(phonestateceiver.java:122)。亨特拉克斯。自动拨号器。自动编辑服务$1$1。在android上运行(AutoRedialerService.java:97)。操作系统。处理程序。android上的handleCallback(Handler.java:873)。操作系统。处理程序。android上的dispatchMessage(Handler.java:99)。操作系统。活套。android上的loop(Looper.java:193)。应用程序。活动线程。java上的main(ActivityThread.java:6669)。朗。反思。方法在com上调用(本机方法)。Android内部的操作系统。RuntimeInit$MethodAndArgsCaller。运行(RuntimeInit.java:493)W/System。错误:在com上。Android内部的操作系统。合子体。main(ZygoteInit.java:858)由以下原因引起:java。lang.SecurityException:需要修改\电话\状态权限。在Android。操作系统。包裹android上的createException(Parcel.java:1942)。操作系统。包裹readException(Parcel.java:1910)W/System。呃:在android上。操作系统。包裹com上的readException(packet.java:1860)。Android内部的电话。ITelephony$Stub$Proxy。endCall(ITelephony.java:2249)。。。10多

共有3个答案

陈渊
2023-03-14

使用Telecomanger,使用接听电话权限,以编程方式结束Android 9及以上版本的通话。

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
    TelecomManager tm = (TelecomManager) getSystemService(Context.TELECOM_SERVICE);
    if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ANSWER_PHONE_CALLS) == PackageManager.PERMISSION_GRANTED) {
        success = tm.endCall();
        Log.d("call state", "call end");
    }
}
丰胤运
2023-03-14

正如cantona_7所提到的,MODIFY_PHONE_STATE是仅限系统的权限,没有root访问权限,您无法访问它,并且没有从pie开始终止呼叫的解决方法。

如官方网站所述:

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

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

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

吉岳
2023-03-14

MODIFY_PHONE_状态是仅限系统的权限,您可以根设备并将应用程序放入/system/priv-app文件夹。但是还有其他的方法来解决你的问题。你到底想干什么。

看一下这里

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

这可能与以前版本的平台有所不同,但这没关系,因为它只保护私有API,因此如果您正在做需要它的事情,那么您使用的私有API不受支持,并且会导致应用程序在平台的不同版本上中断。

您包含的堆栈爬网尚未完成,因此无法确定您实际在做什么。

 类似资料:
  • 我有一个英国电话号码的PHP验证,由潜在客户在我的表格中计算。它看起来像这样: 问题是,在这种形式下,它只允许电话号码前面有一个0,后面有十个数字(),而且最近也有合法的电话号码,前面的零后面有十一个数字。 如何更改代码以允许使用这些类型的电话号码?

  • 本文向大家介绍Android广播接实现监听电话状态(电话的状态,拦截),包括了Android广播接实现监听电话状态(电话的状态,拦截)的使用技巧和注意事项,需要的朋友参考一下 首先我们来理解下监听器的机制。 Android的事件处理机制有两种:监听和回调。 A基于监听的事件处理 主要涉及三类对象:EventSource(事件源),Event(事件),EventListener(事件监听器) 监听机

  • 我有一个较大的代码库,包含许多装饰器类,它们通常将除一个方法外的所有方法委托给一个委托对象,例如: 现在,我正在使用Junit 5为这些包装创建单元测试,调用上的每个方法,并希望验证包装委托上是否有调用,这是一个Mockito mock。 以下是我目前的代码: 当我运行这个,我得到的错误是: 我是否做错了什么,或者如果您不知道确切的方法,是否无法验证方法调用?

  • 9,23日 20min 突然打电话面我, 本科双非,硕士211, 投的嵌入式测试岗(我都不记得我投过这个所,这个岗, 突然打电话让我懵了) 简要说明你的项目做了啥? TCP和UDP的区别 聊不了解测试? 线程和进程的区别 C++STL简单说明 然后开始问我有什么想了解的? 交流之后结束,以为有戏, 结果至今没信. update: 10.11 下午 收到HR电话,邀面,已拒 #中电##中电三十二所#

  • 我有一个很好的问题——创建一个包含联系人列表的电话簿。正如电话簿所说, > 联系人总是要分类的。(按姓名) 可以用星号标记某些联系人,因此他们必须高于其他联系人。(按联系人创建时间排序*联系人) } 测试代码 } 面临的问题: 容器再也找不到条目了,怎么了?我确实试过在Contact上加上equals和hashcode,显然,如果存在一个Comparator/Comparable,那么compar

  • 问题内容: 表现: 在此代码中,Toast始终显示“不收费!”。我在实际设备上进行了测试,将其插入交流或USB电源时,它仍显示“ Not Charging!”(未充电!)。吐司 问题答案: 您无法通过清单进行注册,因此您不会收到这些广播。您正在尝试从中获得额外收入,而这些没有额外收入(例如)。结果,您将获得默认值。