Android开发利用AIDL实现结束通话的程序,会闪退怎么办?

https://www.bilibili.com/video/BV1CV411q7dL?p=196
原课程视频如上,在按照视频中的代码进行编程时,点击按钮,会报错,程序会闪退,也不能挂断电话。后来经过调试发现,具体错误的代码为
iTelephony.endCall(); 它之前的代码都是没有错误。核心代码如下。


public void endCall(View v) throws Exception{
        //Toast.makeText(getApplicationContext(), "hangUp1", 0).show();
    TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    Class tmClazz = tm.getClass();
    Method getITelephonyMethod = tmClazz.getDeclaredMethod("getITelephony", null);
    getITelephonyMethod.setAccessible(true);
    ITelephony iTelephony = (ITelephony) getITelephonyMethod.invoke(tm, null);

    iTelephony.endCall(); //该行代码会报错,且不知道如何解决,它以上的代码都没问题,而且也添加了 用户权限。
    }

错误信息如下:
2021-07-31 22:08:04.302 21180-21180/com.example.app07_remoteservice E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.app07_remoteservice, PID: 21180
java.lang.IllegalStateException: Could not execute method for android:onClick
at android.view.View$DeclaredOnClickListener.onClick(View.java:5336)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:5331)
at android.view.View.performClick(View.java:6256) 
at android.view.View$PerformClick.run(View.java:24701) 
at android.os.Handler.handleCallback(Handler.java:789) 
at android.os.Handler.dispatchMessage(Handler.java:98) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6541) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
Caused by: java.lang.SecurityException: MODIFY_PHONE_STATE permission required.
at android.os.Parcel.readException(Parcel.java:1943)
at android.os.Parcel.readException(Parcel.java:1889)
at com.android.internal.telephony.ITelephony$Stub$Proxy.endCall(ITelephony.java:1937)
at com.example.app07_remoteservice.MainActivity.endCall(MainActivity.java:62)
at java.lang.reflect.Method.invoke(Native Method) 
at android.view.View$DeclaredOnClickListener.onClick(View.java:5331) 
at android.view.View.performClick(View.java:6256) 
at android.view.View$PerformClick.run(View.java:24701) 
at android.os.Handler.handleCallback(Handler.java:789) 
at android.os.Handler.dispatchMessage(Handler.java:98) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6541) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 
代码结构如下:

img

gradle如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.3"

    defaultConfig {
        applicationId "com.example.app07_remoteservice"
        minSdkVersion 26
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

问题出在哪里了,或者有没有其他挂断电话的解决方案。

你这个是2013年的代码,使用的是内部api ,现在代码已经变了很多了,不能使用是正常的。
img

目前结束其他通话的api已经被弃用了,可以使用 CallScreeningService 来管理传入的电话。
参考:

StackOverflow
endCall
CallScreeningService