2012-04-02 147 views
6

我创建简单的调用过滤器应用程序,限制不需要的调用。我使用下面的代码来限制呼叫,但我无法在下面的代码中解决此行的问题“com.android.internal.telephony.ITelephony telephonyService =(ITelephony)m.invoke(tm);”它显示错误消息com.android.internal.telephony无法解析为Android中的类型如何解决此错误。如何解决此错误“com.android.internal.telephony无法解析为类型”在android

public class CallBlockReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 

    } 

    private void getTeleService(Context context) { 
     TelephonyManager tm = (TelephonyManager) context 
       .getSystemService(Context.TELEPHONY_SERVICE); 
     try { 
      // Java reflection to gain access to TelephonyManager's 
      // ITelephony getter 
      Log.v("", "Get getTeleService..."); 
      Class c = Class.forName(tm.getClass().getName()); 
      Method m = c.getDeclaredMethod("getITelephony"); 
      m.setAccessible(true); 
      com.android.internal.telephony.ITelephony telephonyService = (ITelephony) m.invoke(tm); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      Log.e("", 
        "FATAL ERROR: could not connect to telephony subsystem"); 
      Log.e("", "Exception object: " + e); 
     } 
} 

} 

请帮帮我。

+2

您在项目中添加了ITelephony.AIDL文件?如果你已经添加了,那么你的包名称必须包名称必须是'com/android/internal/telephony/ITelephony.AIDL' – 2012-04-02 06:01:53

+0

不,我没有添加ITelephony.AIDL文件。如何添加它? – 2012-04-02 06:12:51

+0

@ρяσѕρєяK - 这个文件夹结构是在“myApp/App/src”下面吗?我试着创建这个文件夹结构,但是当输入“import com.example.app ...”时,Andoid Studio编辑器自动完成并没有显示它。 – buzibuzi 2013-12-06 14:25:37

回答

10

您已将ITelephony.AIDL文件添加到您的项目中?如果已添加,则包名称必须为com/android/internal/telephony/ITelephony.AIDL: 以获取更多信息Blocking Incoming call。从here下载AIDL文件

+0

Prashant,在src文件夹内制作com/android/internal/telephony文件夹结构,并将aidl电话文件夹中的文件 – 2012-04-02 06:22:59

+0

非常感谢Imran的工作...... :) – 2012-04-02 06:35:02

+0

遵循这些步骤并清理项目为我工作。非常感谢... – 2015-01-14 04:53:54

0

您正在使用内部/隐藏的Android API进行反射。

检查您是否试图调用有效的方法名称 - 此API很有可能已更改或您正在开发的版本中不存在。

5

您可以使用反射来调用ITelephony对象上的方法,从而避免需要指定类型并添加AIDL文件。例如,结束通话:

TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
Class<?> c = Class.forName(tm.getClass().getName()); 
Method m = c.getDeclaredMethod("getITelephony"); 
m.setAccessible(true); 
Object telephonyService = m.invoke(tm); 
Class<?> telephonyServiceClass = Class.forName(telephonyService.getClass().getName()); 
Method endCallMethod = telephonyServiceClass.getDeclaredMethod("endCall"); 
endCallMethod.invoke(telephonyService); 
+0

非常感谢!辉煌的答案! – 2016-07-05 16:54:09

相关问题