可以通过sdk实例化telephony.Phone对象吗?

时间:2010-01-27 00:28:53

标签: android

我正在尝试获取一个电话对象,以便我可以在我的应用程序中拨打和召开两个号码。

我尝试过使用静态PhoneFactory.makeDefaultPhones((Context)this),但没有运气。

String phoneFactoryName = "com.android.internal.telephony.PhoneFactory";
String phoneName = "com.android.internal.telephony.Phone";
Class phoneFactoryClass = Class.forName(phoneFactoryName);
Class phoneClass = Class.forName(phoneName);
Method getDefaultPhone = phoneFactoryClass.getMethod("getDefaultPhone");
Object phoneObject = getDefaultPhone.invoke(null);
  

错误 - 由java.lang.RuntimeException引起:必须从Looper线程调用PhoneFactory.getDefaultPhone

6 个答案:

答案 0 :(得分:11)

是的,可以实例化。但你必须克服几个障碍:

  • AndroidManifest.xml

      

    机器人:sharedUserId = “android.uid.phone”

    <manifest>标记内。这是为了防止在您可能调用的方法(如SecurityException)发送受保护的Intent时抛出android.intent.action.SIM_STATE_CHANGED

  •   

    机器人:过程= “com.android.phone”

    <application>标记中。这是允许调用getDefaultPhone() / makeDefaultPhone()

  • 所必需的
  • 要完成所有这些操作,您的应用必须使用系统签名密钥进行签名。

答案 1 :(得分:4)

至少我们可以回答或忽略来电=)让我复制粘贴我的帖子

OMG !!!是的,我们可以做到!!! 经过长达24小时的调查和发现后我才会自杀...但我找到了一个“新鲜”的解决方案!

// "cheat" with Java reflection to gain access
// to TelephonyManager's ITelephony getter
Class c = Class.forName(tm.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony)m.invoke(tm);

想要开发他们的呼叫控制软件的人访问这个起点: http://www.google.com/codesearch/p?hl=en#zvQ8rp58BUs/trunk/phone/src/i4nc4mp/myLock/phone/CallPrompt.java&q=itelephony%20package:http://mylockforandroid%5C.googlecode%5C.com&d=0

有一个项目。并且有重要的评论(和学分)。

简而言之:复制AIDL文件,为清单添加权限,复制粘贴源以进行电话管理。

为您提供更多信息。 AT命令只有在你扎根的情况下才能发送。你可以杀死系统进程并发送命令,但你需要重新启动才能让你的手机接收和发送电话。

我很开心! =)现在我的Shake2MuteCall将获得更新!

答案 2 :(得分:2)

HY。我能够检索到这个类的一个ProxyPhone(以及一点反思)。您可以使用下面的(反射)PhoneFactory:

package your.package;

import java.lang.reflect.Method;

import android.content.Context;
import android.util.Log;

public class ReflectedPhoneFactory {

public static final String TAG = "PHONE";

public static void makeDefaultPhones(Context context) throws IllegalArgumentException {

    try{

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes")
      Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory");

      //Parameters Types
      @SuppressWarnings("rawtypes")
      Class[] paramTypes= new Class[1];
      paramTypes[0]= Context.class;

      Method get = PhoneFactory.getMethod("makeDefaultPhone",  paramTypes);

      //Parameters
      Object[] params= new Object[1];
      params[0]= context;

      get.invoke(null, params);

    }catch( IllegalArgumentException iAE ){
        throw iAE;
    }catch( Exception e ){
        Log.e(TAG, "makeDefaultPhones", e);
    }

}

public static void makeDefaultPhone(Context context) throws IllegalArgumentException {

    try{

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes")
      Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory");

      //Parameters Types
      @SuppressWarnings("rawtypes")
      Class[] paramTypes= new Class[1];
      paramTypes[0]= Context.class;

      Method get = PhoneFactory.getMethod("makeDefaultPhone",  paramTypes);

      //Parameters
      Object[] params= new Object[1];
      params[0]= context;

      get.invoke(null, params);

    }catch( IllegalArgumentException iAE ){
        throw iAE;
    }catch( Exception e ){
        Log.e(TAG, "makeDefaultPhone", e);
    }

}

/*
 * This function returns the type of the phone, depending
 * on the network mode.
 *
 * @param network mode
 * @return Phone Type
 */
public static Integer getPhoneType(Context context, int networkMode) throws IllegalArgumentException {

    Integer ret= -1;

    try{

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes")
      Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory");

      //Parameters Types
      @SuppressWarnings("rawtypes")
      Class[] paramTypes= new Class[1];
      paramTypes[0]= Integer.class;

      Method get = PhoneFactory.getMethod("getPhoneType", paramTypes);

      //Parameters
      Object[] params= new Object[1];
      params[0]= new Integer(networkMode);

      ret= (Integer) get.invoke(PhoneFactory, params);

    }catch( IllegalArgumentException iAE ){
        throw iAE;
    }catch( Exception e ){
        ret= -1;
    }

    return ret;

}

public static Object getDefaultPhone(Context context) throws IllegalArgumentException {

    Object ret= null;

    try{

        ClassLoader cl = context.getClassLoader(); 
        @SuppressWarnings("rawtypes")
        Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory");

        Method get = PhoneFactory.getMethod("getDefaultPhone",  (Class[]) null);
        ret= (Object)get.invoke(null, (Object[]) null);

    }catch( IllegalArgumentException iAE ){
        throw iAE;
    }catch( Exception e ){
        Log.e(TAG, "getDefaultPhone", e);
    }

    return ret;

}

public static Phone getCdmaPhone(Context context) throws IllegalArgumentException {

    Phone ret= null;

    try{

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes")
      Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory");

      Method get = PhoneFactory.getMethod("getCdmaPhone",  (Class[]) null);
      ret= (Phone)get.invoke(null, (Object[]) null);

    }catch( IllegalArgumentException iAE ){
        throw iAE;
    }catch( Exception e ){
        //
    }

    return ret;

}

public static Phone getGsmPhone(Context context) throws IllegalArgumentException {

    Phone ret= null;

    try{

      ClassLoader cl = context.getClassLoader(); 
      @SuppressWarnings("rawtypes")
      Class PhoneFactory = cl.loadClass("com.android.internal.telephony.PhoneFactory");

      Method get = PhoneFactory.getMethod("getGsmPhone",  (Class[]) null);
      ret= (Phone)get.invoke(null, (Object[]) null);

    }catch( IllegalArgumentException iAE ){
        throw iAE;
    }catch( Exception e ){
        //
    }

    return ret;

}
}

使用它,使用代码:

        ReflectedPhoneFactory.makeDefaultPhone(yourContext);
        Object phoneProxy= ReflectedPhoneFactory.getDefaultPhone(yourContext);

请注意,“makeDefaultPhone”调用将更新静态成员“static private Looper sLooper”的值;我还没有测试附带效果。

使用收到的“phoneProxy”对象,您可以使PhoneProxy调用成为反射。 (我目前正在实施这个课程,如果认为有用,可以发布。

答案 3 :(得分:0)

  

我正试图获得一个电话对象   我可以打电话和会议两个   我的申请中的数字。

SDK无法做到这一点。

  

我尝试过使用静态   PhoneFactory.makeDefaultPhones((上下文)本)   但没有运气。

这不在SDK中。请do not go past the bounds of the SDK

  

错误 - 由...引起   了java.lang.RuntimeException:   PhoneFactory.getDefaultPhone必须是   从Looper线程调用

那是因为你正试图做一件事 - 你不应该从后台线程做的事情。

答案 4 :(得分:0)

我在Activity.onCreate中调用它,并在遇到以下错误后崩溃了几行:

  

默认手机尚未制作!

See the Android sources

public static Phone getDefaultPhone() {
    if (sLooper != Looper.myLooper()) {
        throw new RuntimeException(
            "PhoneFactory.getDefaultPhone must be called from Looper thread");
    }

    if (!sMadeDefaults) {
        throw new IllegalStateException("Default phones haven't been made yet!");
    }
    return sProxyPhone;
}

答案 5 :(得分:0)

Fyi,内部类Phone,CallManager等等都从/system/framework/framework.jar移到了Jelly bean中的/system/framework/telephony-common.jar。