2014-07-04 69 views
5

我想掛斷來電,檢測到它,然後我想掛斷它。如何將com.android.internal.telephony.ITelephony導入到Android應用程序

問題是這樣的:com.android.internal.telephony.ITelephony沒有解決。

我試圖將包com.android.internal.telephony到我的應用程序並創建界面:

package com.android.internal.telephony; 

public interface ITelephony {  

    boolean endCall();  

    void answerRingingCall();  

    void silenceRinger(); 

} 

但呼叫沒有結束。

在這裏,我發現調用,顯示吐司(它顯示),然後嘗試掛斷電話,但我第一次說沒有com.android.internal.telephony.ITelephony之前,我創建了一個包:

private class CallStateListener extends PhoneStateListener { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: 
       // called when someone is ringing to this phone 
       Toast.makeText(ctx, "Incoming: " + incomingNumber, Toast.LENGTH_LONG).show(); 
       try{ 
         TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); 
         Class c = Class.forName(tm.getClass().getName()); 
         Method m = c.getDeclaredMethod("getITelephony"); 
         com.android.internal.telephony.ITelephony telephonyService = (com.android.internal.telephony.ITelephony) m.invoke(tm); 

         telephonyService = (com.android.internal.telephony.ITelephony) m.invoke(tm); 
         telephonyService.silenceRinger(); 
         telephonyService.endCall(); 
        }catch (Exception e) { 
         e.printStackTrace(); 

        } 
       break; 
      } 
     } 
    } 

我的清單和權限:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.a" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="17" 
     android:targetSdkVersion="17" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service 
      android:name=".CallDetectService" 
      android:enabled="true" 
      android:exported="false" > 
     </service> 
    </application> 



</manifest> 

回答

14

ITelephony接口是內部的,所以你不能得到它的標準引用。您可能使用反射一路,即

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 

Method m1 = tm.getClass().getDeclaredMethod("getITelephony"); 
m1.setAccessible(true); 
Object iTelephony = m1.invoke(tm); 

Method m2 = iTelephony.getClass().getDeclaredMethod("silenceRinger"); 
Method m3 = iTelephony.getClass().getDeclaredMethod("endCall"); 

m2.invoke(iTelephony); 
m3.invoke(iTelephony); 

但不管怎樣這些方法需要MODIFY_PHONE_STATE權限,只能被授予系統應用。所以恐怕它不會工作。

+0

在Android Play商店中有標準撥號器(電話應用程序)的替代品,也許有辦法繞過它。 – Yoda

+0

哦,請看這裏編輯3這裏:http://stackoverflow.com/questions/24580223/how-to-reject-any-incoming-call-when-i-have-already-detected-it/24580252?noredirect=1 #comment38077652_24580252這是我剛纔從grep代碼複製了'ITelephony'接口的問題(http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/com /android/internal/telephony/ITelephony.java/?v=source)到'com.android.internal.telephone'包。 – Yoda

+0

就在一邊。它爲什麼是內部的?內部意味着私密還是保護?如果要禁用對它的訪問,那麼如果reflelction完成這項工作,它並不是真正的工作,那麼爲什麼這樣做呢? – Yoda

相關問題