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)
代码结构如下:
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 ,现在代码已经变了很多了,不能使用是正常的。
目前结束其他通话的api已经被弃用了,可以使用 CallScreeningService 来管理传入的电话。
参考: