实现直接拒接来电经过简单的google/baidu后,发现android没有现成的API去拒接电话。
android可以通过注册BroadcastReceiver截取短信,因为这个broadcast是一个ordered broadcast,所以只要优先级比短信接收程序高,就可以提前终止掉这个broadcast receiver。
但是,电话呼入则没有类似的机制。
不过,综合网上的一些资料,通过以下大体的步骤,则可以实现拒接电话:1、注册broadcast receiver,监视手机状态:Java代码1.<receiver android:name=".PhoneBroadcastReceiver">2.<intent-filter>3. <action android:name="android.intent.action.PHONE_STATE" />4.</intent-filter>5.</receiver><receiverandroid:name=".PhoneBroadcastReceiver"> <intent-filter> <actio n android:name="android.intent.action.PHONE_STATE"/> </intent-filter> </receiver>当手机接收到电话时,则会触发该broadcast receiver。
2、最重要的,就是取得可以控制电话的API。
这些API貌似是android内部的接口,并未暴露。
具体方式参见该帖子:/u/20091226 ... d-586a278875c0.html使用时需要手动添加import:Java代码1.import com.android.internal.telephony.ITelephony;import com.android.internal.telephony.ITelephony;同样的方式,在stackoverflow上也有人大致地提了下:/questio ...ck-calls-in-android值得注意的是,使用这种方式拒接来电,broadcast receiver会被触发两次。
第一次是收到来电,第二次则是由于调用endCall拒接了后触发。
我们在处理自己的程序逻辑时,可以通过ITelephony.getCallState来区分。
该函数返回1表示来电,0表示拒接来电。
最后,这个方法有时候依然会出现系统接听电话的界面,并且,通话记录里也会有拒接电话的记录。
这个原因大概也是系统底层在处理这块逻辑时,系统逻辑和通知broadcast receiver的存在先后顺序。
这篇文章中分析了部分源码,也算是提个醒:http://blog.wangling.me/2009/08/why-it-is-impossible-to-intercept-incoming-calls-on-and roid/[经验分享]获取联系人信息和删除联系人1./**2.* 根据提供的ID删除数据库中相对应的项3.* @param id4.* @param listId5.*/6.public void delete(String id) {7.if(id.equals("") || id == null){8.return ;9.}10.Uri uri= ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, Integer.parseInt(id));11.Uri.Builder b = uri.buildUpon();12. b.appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER,"true");13.uri = b.build();14.getContentResolver().delete(uri, null, null);15.}16.17.private ArrayList<String> getContactCompany(String contactId){18.// 获取该联系人组织19.ArrayList<String> companyArrayList = new ArrayList<String>();20. Cursor organizationCursor =getContentResolver().query(Uri.parse("content://com.android.contacts/data "),21.new String[] { "data1", "data2", "data4" },22."contact_id="23. + contactId24. + " and "25. +"mimetype='vnd.android.cursor.item/organization'",26.null, null);27. String idd=contactId;28.int count = organizationCursor.getCount();29.if (organizationCursor.getCount() != 0) {30.if (organizationCursor.moveToNext()) {31.String company =organizationCursor.getString(organizationCursor.getColumnIndex(Organizati PANY));32.String title =organizationCursor.getString(organizationCursor.getColumnIndex(Organizati on.TITLE));panyArrayList.add(company);panyArrayList.add(title);35. }36.}37.return companyArrayList;38.39.}40.41.** 获取联系人头像42.*43.* @param id 用户ID44.* @return45.*/46.Bitmap getContactBitmap(String id){47.ContentResolver cr = getContentResolver();48.Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,49. Long.parseLong(id));50.InputStream input =51. ContactsContract.Contacts.openContactPhotoInputStream(cr,uri);52.if(input == null){53.//Log.e("star","input is null");54. InputStreamis=getResources().openRawResource(ers);55. BitmapDrawable bmpDraw = null;56. bmpDraw = new BitmapDrawable(is);57. Bitmap aa= null;58. aa = bmpDraw.getBitmap();59. Bitmap newb = Bitmap.createScaledBitmap(aa, 50, 50, false);60.61.return newb;62.} else {63. Bitmap contactPhoto = BitmapFactory.decodeStream(input);64. Bitmap newb = Bitmap.createScaledBitmap(contactPhoto, 50, 50,false);65.return newb;66.}67.68.}69.70./** 获取联系人信息71.*72.* ContactsContract.Contacts.DISPLAY_NAME姓名73.* PANY; 公司74.* ContactsContract.Contacts._ID ID75.*76.* @param param77.* @return 相关信息78.*/79.String getContactInfo(final String param){80.if(mContactCursor != null){81.82.int id = mContactCursor.getColumnIndexOrThrow(param);83. String aaString= mContactCursor.getString(id);84.return aaString;85.}86.return"";87.}88.89./** 获取联系人电话号码90.*91.* @return 电话号码92.*/93.String getContactPhoneNumber(){94.ArrayList<String> alTemp = new ArrayList<String>();95.String IsPhone =mContactCursor.getString(mContactCursor.getColumnIndex(ContactsContra ct.Contacts.HAS_PHONE_NUMBER));96.if( (Integer.parseInt(IsPhone) > 0) )97.{98. Cursor phoneNumber =getContentResolver().query(monDataKinds.Phone.CO NTENT_URI,null,monDataKinds.Phone.CONTACT_ID +"= "+ getContactInfo(ContactsContract.Contacts._ID),null, null);100.while (phoneNumber.moveToNext())101. {102. String strPhoneNumber =phoneNumber.getString(phoneNumber.getColumnIndex(ContactsContract.C ommonDataKinds.Phone.NUMBER));103. alTemp.add(strPhoneNumber);104. }105.106.if(phoneNumber.moveToFirst()){107.returnphoneNumber.getString(phoneNumber.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));108. }109.}110.111.return"";112.}package com.henii.android;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.telephony.SmsManager;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Toast;//!!!可以通过启动两个模拟器进行测试,发送短信时就拨另一个的端口号(如5554等)就行了!!!//在AndroidManifest.xml中要添加权限:<uses-permission android:name="android.permission.SEND_SMS"/>public class SMSActiv ity extends Activity {private EditText mobileText;private EditText contText;private Button sendBtn;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);//根据id找到控件并实例化它mobileText = (EditText)findViewById(R.id.MobileEditText);contText = (EditText)findViewById(R.id.ContEditText);sendBtn = (Button)findViewById(R.id.SendButton);//发送按钮的处理事件sendBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {String content = contText.getText().toString();String mobile = mobileText.getText().toString();//获得发送短信的管理器,使用的是android.telephony.SmsManagerSmsManager smsManager = SmsManager.getDefault();//如果短信内容过长则分段发送if(content.length() > 70){//使用短信管理器进行短信内容的分段,返回分成的段ArrayList<String> contents = smsManager.divideMessage(content);for(String msg : contents){//使用短信管理器发送短信内容//参数一为短信接收者//参数三为短信内容//其他可以设为nullsmsManager.sendTextMessage(mobile, null, msg, null, null);}//否则一次过发送}else{smsManager.sendTextMessage(mobile, null, content, null, null);}//吐司,用来显示发送成功的提示Toast.makeText(SMSActivity.this, R.string.sucTxt, Toast.LENGTH_SHORT).show();}});//!!!可以通过启动两个模拟器进行测试,发送短信时就拨另一个的端口号(如5554等)就行了!!!}}。