在AVD上测试ITelephony endCall会抛出java.lang.NoSuchMethodError

时间:2018-01-18 15:05:46

标签: android avd

当操作系统是Marshmallow及以上版本时,执行调用阻止代码没有问题,但是在AVD中的Kitkat上测试它会导致java.lang.NoSuchMethodError: com.android.internal.telephony.ITelephony.endCall

public interface ITelephony {

     void endCall();
     void silenceRinger();

}

这些是使用的权限:

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

这是在BroadcastReceiver中执行的:

Class<?> c = Class.forName(tm.getClass().getName());

Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);      

ITelephony telephonyService = (ITelephony) m.invoke(tm);

telephonyService.silenceRinger();
telephonyService.endCall();

这是我的傻瓜:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    buildToolsVersion '26.0.2'
    defaultConfig {
        applicationId "com.app.testapp"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:27.0.2'
    implementation 'com.android.support:design:27.0.2'
    implementation 'com.googlecode.libphonenumber:libphonenumber:8.8.3'
    implementation 'com.google.android.gms:play-services-ads:11.8.0'
}

1 个答案:

答案 0 :(得分:0)

从API 29开始,该方法在此类中不再可用。也没有替代方法。我已经检查了此类中所有可用的方法。这可能与以下事实有关,即它也已从TelecomManager https://developer.android.com/reference/android/telecom/TelecomManager.html#endCall()中删除。使用自定义拨号器处理呼叫仍然可以。