در این سری از آموزش برنامه نویسی اندروید به آموزش رد تماس (reject) تماس های ورودی در اندروید خواهیم پرداخت در این آموزش بررسی می شود که شماره ای با شما تماس گرفته است در لیست مخاطبان شما هست یا خیر و در صورت نبودن تماس reject می شود
ابتدای کار وارد فایل AndroidManifest.xml شده و دسترسی های زیر را اضافه کنید.
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS"/>
یک فایل جاوا به نام IncomingCallReceiver.java ایجاد کرده و کدهای زیر را در آن قرار دهید.
IncomingCallReceiver
import java.lang.reflect.Method;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.media.AudioManager;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
public class IncomingCallReceiver extends BroadcastReceiver{
String incomingNumber="";
AudioManager audioManager;
TelephonyManager telephonyManager;
public void onReceive(Context context, Intent intent) {
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
telephonyManager= (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (intent.getAction().equals("android.intent.action.PHONE_STATE")) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
}
if(!incomingNumber.equals("")){
ContentResolver cr=context.getContentResolver();
Cursor numbers=cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.NUMBER},
ContactsContract.CommonDataKinds.Phone.NUMBER +"=?", new String[]{incomingNumber}, null);
if(numbers.getCount()<=0){
audioManager.setStreamMute(AudioManager.STREAM_RING, true);
rejectCall();
startApp(context,incomingNumber);
}
}
}
private void startApp(Context context, String number){
Intent intent=new Intent(context,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra("number", "Rejected incoming number:"+number);
context.startActivity(intent);
}
private void rejectCall(){
try {
Class<?> classTelephony = Class.forName(telephonyManager.getClass().getName());
Method method = classTelephony.getDeclaredMethod("getITelephony");
method.setAccessible(true);
Object telephonyInterface = method.invoke(telephonyManager);
Class<?> telephonyInterfaceClass =Class.forName(telephonyInterface.getClass().getName());
Method methodEndCall = telephonyInterfaceClass.getDeclaredMethod("endCall");
methodEndCall.invoke(telephonyInterface);
} catch (Exception e) {
e.printStackTrace();
}
}
}
بالاتر کار این کلاس را گفتم ولی یکبار دیگر به آن اشاره خواهم کرد این کلاس بررسی می کند که شماره ای که با شما تماس گرفته است در لیست مخاطبین شما وجود دارد یا خیر در صورتی که نباشد این رسیور تماس را reject می کند.
حالا در بخش activity_main.xml کد های زیر را قرار دهید .
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/txtmessage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FF1111"
android:textSize="20sp"
android:layout_centerInParent="true"
/>
</RelativeLayout>
و کد مربوط به MainActivity.java همانند زیر می شود.
MainActivity.java
import android.support.v7.app.ActionBarActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent=getIntent();
Bundle b=intent.getExtras();
TextView tv=(TextView)findViewById(R.id.txtmessage);
if(b!=null){
tv.setText(b.getString("number"));
}
}
}
و در آخر وارد فایل مانفیست شده و همانند زیر ریسور را تعریف کنید.
<receiver android:name=".IncommingCallReceiver">
<intent-filter android:priority="999">
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
- ۹۹/۰۳/۱۲