Android 使用广播对电话进行监听和挂断

 

1.添加权限

<!--拨打电话的权限-->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!--电话拦截-->
<receiver android:name=".receiver.PhoneBroadcastReceiver">
    <intent-filter android:priority="1000">
        <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        <action android:name="android.intent.action.PHONE_STATE" />
    </intent-filter>
</receiver>
<!-- 电话拦截服务 -->

<service android:name="com.lvshandian.menshen.service.PhoneService">
    <intent-filter>
        <action android:name="com.xinwang.telesms.PhoneReciever"></action>
        <action android:name="com.xinwang.telesms.server.IMICHAT" />
    </intent-filter>
</service>

 

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.telephony.TelephonyManager;
import android.util.Log;


import com.android.internal.telephony.ITelephony;
import com.lvshandian.menshen.service.PhoneService;

import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * Created by zhang on 2016/11/3.
 * 创建电话的监听
 */

public class PhoneBroadcastReceiver extends BroadcastReceiver {


    String TAG = "tag";
    TelephonyManager telMgr;

    @Override
    public void onReceive(Context context, Intent intent) {


        telMgr = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);
        switch (telMgr.getCallState()) {
            //来电
            case TelephonyManager.CALL_STATE_RINGING:
                String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
                Log.v(TAG, "number:" + number);
                Intent myintent = new Intent(context, PhoneService.class);
                myintent.setAction("com.lvshandian.menshen.service.PhoneReciever");
                context.startService(myintent);
//                if (!getPhoneNum(context).contains(number)) {
//                    SharedPreferences phonenumSP = context.getSharedPreferences("in_phone_num", Context.MODE_PRIVATE);
//                    SharedPreferences.Editor editor = phonenumSP.edit();
//                    editor.putString(number, number);
//                    editor.commit();
//                    endCall();
//                }
                break;
            //响铃
            case TelephonyManager.CALL_STATE_OFFHOOK:
                break;
            //挂断
            case TelephonyManager.CALL_STATE_IDLE:
                break;
        }

    }

    /**
     * 挂断电话
     */
    private void endCall() {
        Class<TelephonyManager> c = TelephonyManager.class;
        try {
            Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
            getITelephonyMethod.setAccessible(true);
            ITelephony iTelephony = null;
            Log.e(TAG, "End call.");
            iTelephony = (ITelephony) getITelephonyMethod.invoke(telMgr, (Object[]) null);
            iTelephony.endCall();
        } catch (Exception e) {
            Log.e(TAG, "Fail to answer ring call.", e);
        }
    }

    private ArrayList<String> getPhoneNum(Context context) {
        ArrayList<String> numList = new ArrayList<String>();
        //得到ContentResolver对象
        ContentResolver cr = context.getContentResolver();
        //取得电话本中开始一项的光标
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        while (cursor.moveToNext()) {
            // 取得联系人ID
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            Cursor phone = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
            // 取得电话号码(可能存在多个号码)
            while (phone.moveToNext()) {
                String strPhoneNumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                numList.add(strPhoneNumber);
                Log.v("tag", "strPhoneNumber:" + strPhoneNumber);
            }

            phone.close();
        }
        cursor.close();
        return numList;
    }


}

//进行过滤对比电话

package com.lvshandian.menshen.service;

import java.lang.reflect.Method;
import java.util.List;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

import com.android.internal.telephony.ITelephony;
import com.lvshandian.menshen.bean.PhoneBean;
import com.lvshandian.menshen.receiver.PhoneBroadcastReceiver;
import com.lvshandian.menshen.utils.TextUtils;
import com.lvshandian.menshen.utils.XUtils;

public class PhoneService extends Service {
    String TAG = "tag";
    TelephonyManager telManager;

    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        telManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        telManager.listen(new MyPhoneStateListener(),
                PhoneStateListener.LISTEN_CALL_STATE);
    }

    /**
     * 挂断电话
     */
    private void endCall() {
        Class<TelephonyManager> c = TelephonyManager.class;
        try {
            Method getITelephonyMethod = c.getDeclaredMethod("getITelephony", (Class[]) null);
            getITelephonyMethod.setAccessible(true);
            ITelephony iTelephony = null;
            iTelephony = (ITelephony) getITelephonyMethod.invoke(telManager, (Object[]) null);
            iTelephony.endCall();
        } catch (Exception e) {
        }
    }

    private class MyPhoneStateListener extends PhoneStateListener {
        String phoneNumber;

        public void onCallStateChanged(int state, String incomingNumber) {
            switch (state) {
                case TelephonyManager.CALL_STATE_RINGING: /* 接通 */
                    phoneNumber = incomingNumber;
                    List<PhoneBean> list = XUtils.findAll(PhoneBean.class);
                    for (int i = 0; i < list.size(); i++) {
                        if (TextUtils.isString(list.get(i).getDnseg(), phoneNumber)) {
                            endCall();
                            break;
                        }
                    }

            }
            super.onCallStateChanged(state, incomingNumber);
        }

    }


    @Override
    public void onDestroy() {
        super.onDestroy();
        Intent localIntent = new Intent();
        localIntent.setClass(this, PhoneService.class); // 销毁时重新启动Service
        this.startService(localIntent);
    }

    private int flags;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY_COMPATIBILITY;
    }

    @Override
    public void onStart(Intent intent, int startId) {
// 再次动态注册广播
        IntentFilter localIntentFilter = new IntentFilter("android.intent.action.USER_PRESENT");
        localIntentFilter.setPriority(Integer.MAX_VALUE);// 整形最大值
        myReceiver searchReceiver = new myReceiver();
        registerReceiver(searchReceiver, localIntentFilter);
        super.onStart(intent, startId);
    }

    public class myReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            context.startService(new Intent(context, PhoneBroadcastReceiver.class));
        }
    }
}

到这大家应该知道咋弄了吧  报错的地方是我写的方法用来进行回调等大家根据需求进行更改灵活性大可拓展大看大家怎么用了

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Android监听uimode(用户界面模式)的变化,你可以使用以下步骤: 1. 创建一个BroadcastReceiver类,用于接收系统发送的uimode变化广播。例如: ```java public class UIModeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(Intent.ACTION_CONFIGURATION_CHANGED)) { int currentMode = context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; // 在这里处理uimode变化的逻辑 } } } ``` 2. 在AndroidManifest.xml文件中注册BroadcastReceiver。在`<application>`标签内,添加以下代码: ```xml <receiver android:name=".UIModeReceiver"> <intent-filter> <action android:name="android.intent.action.CONFIGURATION_CHANGED" /> </intent-filter> </receiver> ``` 3. 在需要监听uimode的Activity或Fragment中,注册和注销BroadcastReceiver。例如,在Activity的`onResume()`和`onPause()`方法中添加以下代码: ```java public class MainActivity extends AppCompatActivity { private UIModeReceiver uimodeReceiver; @Override protected void onResume() { super.onResume(); if (uimodeReceiver == null) { uimodeReceiver = new UIModeReceiver(); IntentFilter filter = new IntentFilter(Intent.ACTION_CONFIGURATION_CHANGED); registerReceiver(uimodeReceiver, filter); } } @Override protected void onPause() { super.onPause(); if (uimodeReceiver != null) { unregisterReceiver(uimodeReceiver); uimodeReceiver = null; } } } ``` 通过以上步骤,你就可以在Android监听uimode的变化,并在BroadcastReceiver的`onReceive()`方法中处理相应的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值