xiaoguozi's Blog
Pay it forword - 我并不觉的自豪,我所尝试的事情都失败了······习惯原本生活的人不容易改变,就算现状很糟,他们也很难改变,在过程中,他们还是放弃了······他们一放弃,大家就都是输家······让爱传出去,很困难,也无法预料,人们需要更细心的观察别人,要随时注意才能保护别人,因为他们未必知道自己要什么·····

网上找到的,HTC One X,三星i9000 cm9 4.0.4测试通过,在此记录一下,大伙需要的话就拿去吧..


1. Android 2.3(不包括)以下,通过获取aidl远程服务接口TelephoneyManager来调用它的answerRingingCall方法(ps: 关于此方法具体做法,由于时间关系,我这里就不详细说啦,大家Google一下吧)

        TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
        Class c 
= Class.forName(tm.getClass().getName());
        Method m 
= c.getDeclaredMethod("getITelephony");
        m.setAccessible(
true);
        ITelephony telephonyService;
        telephonyService 
= (ITelephony) m.invoke(tm);

        
// Silence the ringer and answer the call!
        telephonyService.silenceRinger();
        telephonyService.answerRingingCall();



2. Android 2.3(包括)以上,如果照样使用TelephoneyManager获取到的answerRingingCall方法的话,就会抛没有 android.permission.MODIFY_PHONE_STATE权限异常,其实你已经配了这个权限的了,但是不好意思,你的App不是系统 软件,没有系统签名,所以还是不能调用,除非,你root了你的手机,把你的app装到系统软件里面去,所以这里使用另外一种方法实现自动接听这个行为 了,详细如下:

刚开始我用这段代码的,发现三星机型可以,但HTC(如: G10 , One X)不行,

 Intent intent = new Intent("android.intent.action.MEDIA_BUTTON");
 KeyEvent keyEvent 
= new KeyEvent(KeyEvent.ACTION_DOWN,  KeyEvent.KEYCODE_HEADSETHOOK);
 intent.putExtra(
"android.intent.extra.KEY_EVENT",keyEvent);
 sendOrderedBroadcast(intent,
"android.permission.CALL_PRIVILEGED");
 intent 
= new  Intent("android.intent.action.MEDIA_BUTTON");
 keyEvent 
= new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK);
 intent.putExtra(
"android.intent.extra.KEY_EVENT",keyEvent);
 sendOrderedBroadcast(intent,
"android.permission.CALL_PRIVILEGED");



后来又google到了这段代码,经过测试,完全好使..


Intent localIntent1 = new Intent(Intent.ACTION_HEADSET_PLUG);
localIntent1.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
localIntent1.putExtra(
"state"1);
localIntent1.putExtra(
"microphone"1);
localIntent1.putExtra(
"name""Headset");
CallingActivity.
this.sendOrderedBroadcast(localIntent1,"android.permission.CALL_PRIVILEGED");

Intent localIntent2 
= new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent localKeyEvent1 
= new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_HEADSETHOOK);
localIntent2.putExtra(
"android.intent.extra.KEY_EVENT",localKeyEvent1);
CallingActivity.
this.sendOrderedBroadcast(localIntent2,"android.permission.CALL_PRIVILEGED");

Intent localIntent3 
= new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent localKeyEvent2 
= new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_HEADSETHOOK);
localIntent3.putExtra(
"android.intent.extra.KEY_EVENT",localKeyEvent2);
CallingActivity.
this.sendOrderedBroadcast(localIntent3,"android.permission.CALL_PRIVILEGED");

Intent localIntent4 
= new Intent(Intent.ACTION_HEADSET_PLUG);
localIntent4.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
localIntent4.putExtra(
"state"0);
localIntent4.putExtra(
"microphone"1);
localIntent4.putExtra(
"name""Headset");
CallingActivity.
this.sendOrderedBroadcast(localIntent4,"android.permission.CALL_PRIVILEGED");
posted on 2012-06-07 17:20 小果子 阅读(1978) 评论(2)  编辑 收藏 引用 所属分类: 开源Android & Ios

FeedBack:
# re: Android 自动接听来电
2013-12-05 17:24 | yudy
CallingActivity这个类在哪里?  回复  更多评论
  
# re: Android 自动接听来电
2014-02-26 15:09 | jpson
没权限啊  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理