android如何使用BroadcastReceiver后台实现来电通话记录的监听

android如何使用BroadcastReceiver后台实现来电通话记录的监听并存取到sqllite数据库通过Contentprovilder实现接口

BroadcastReceiver 是android四大组件的一个,本质上是一种全局的监听器 ,用于监听全局的广播消息。下面实现了后台监听android手机通话记录。本demo 分两个程序,第一个程序是设置监听器,然后模拟器重启后就会有一个全局的 service在后台监听你的来电显示,大多数通话管理软件都是这么干的,第二个项 目是获取通话记录的,由于只是做一个小实验,所以是根据某个项目改的,里面 涉及到一些ContentPrivler的知识,还有sqllite数据库,里面定义名称并非其意 思。

第一个程序代码配置文件

<?xml version="1.0" encoding="utf-8"?>
<manifest 

xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android"
    android:versionCode="1"
    android:versionName="1.0" >
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
        <service android:name=".TtActivity">
        </service>
        <!-- 定义一个BroadcastReceiver,监听系统开机广播  -->
        <receiver android:name=".LaunchReceiver">
            <intent-filter>
               <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <provider android:name=".DictProvider"  android:authorities="org.crazyit.providers.dictprovider"/>
    </application>
    <!-- 授予应用程序访问系统开机事件的权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

</manifest>

/**
 *
 */
package com.android;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class LaunchReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        Intent tIntent = new Intent(context , TtActivity.class);
        // 启动指定Service
        context.startService(tIntent);
    }
}

/**
 *
 */
package com.android;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class MyDatabaseHelper extends SQLiteOpenHelper
{
    final String CREATE_TABLE_SQL =
        "create table dict(_id integer primary key autoincrement , word , detail)";
    /**
     * @param context
     * @param name
     * @param version
     */
    public MyDatabaseHelper(Context context, String name, int version)
    {
        super(context, name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        // 第一个使用数据库时自动建表
        db.execSQL(CREATE_TABLE_SQL);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    {
        System.out.println("--------onUpdate Called--------"
            + oldVersion + "--->" + newVersion);
    }
}

package com.android;

import java.io.FileNotFoundException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;

public class TtActivity extends Service
{   MyDatabaseHelper dbHelper;
    TelephonyManager tManager;
    SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String word=format.format(new Date());
    @Override
    public IBinder onBind(Intent intent)
    {
        return null;
    }
    @Override
    public void onCreate()
    {
        tManager = (TelephonyManager) getSystemService
                (Context.TELEPHONY_SERVICE);
        dbHelper = new MyDatabaseHelper(this
                , "myDict.db3" , 1);
            // 创建一个通话状态监听器
            PhoneStateListener listener = new PhoneStateListener()
            {
                @Override
                public void onCallStateChanged(int state
                    , String detail)
                {
                    switch (state)
                    {
                        // 无任何状态
                        case TelephonyManager.CALL_STATE_IDLE:
                            break;
                        case TelephonyManager.CALL_STATE_OFFHOOK:
                            break;
                        // 来电铃响时
                        case TelephonyManager.CALL_STATE_RINGING:
                            OutputStream os = null;
                            try
                            {
                                os = openFileOutput("phoneList", MODE_APPEND);
                            }
                            catch (FileNotFoundException e)
                            {
                                e.printStackTrace();
                            }

                            insertData(dbHelper.getReadableDatabase() , word , detail);
//                            PrintStream ps = new PrintStream(os);
//                            // 将来电号码记录到文件中
//                            ps.println(new Date() + "    来电:" + incomingNumber);
//                            ps.close();
                            break;
                        default:
                            break;
                    }
                    super.onCallStateChanged(state, detail);
                }
            };
            //监听电话通话状态的改变
            tManager.listen(listener
                , PhoneStateListener.LISTEN_CALL_STATE);
        }
    private void insertData(SQLiteDatabase db
            , String word , String detail)
        {
            //执行插入语句
            db.execSQL("insert into dict values(null , ? , ?)"
                , new String[]{word , detail});
        }
        @Override
        public void onDestroy()
        {
            super.onDestroy();
            //退出程序时关闭MyDataBaseHelper里的SQLiteDatabase
            if (dbHelper != null)
            {
                dbHelper.close();
            }
        }
}

/**
 *
 */
package com.android;

import android.net.Uri;
import android.provider.BaseColumns;

/**
 * @version  1.0
 */
public final class Words
{
    // 定义该ContentProvider的Authority
    public static final String AUTHORITY
        = "org.crazyit.providers.dictprovider";
    //定义一个静态内部类
    public static final class Word implements BaseColumns
    {
        // 定义Content所允许操作的3个数据列
        public final static String _ID = "_id";
        public final static String WORD = "word";
        public final static String DETAIL = "detail";
        // 定义该Content提供服务的两个Uri
        public final static Uri DICT_CONTENT_URI =
            Uri.parse("content://" +  AUTHORITY + "/words");
        public final static Uri WORD_CONTENT_URI =
            Uri.parse("content://" +  AUTHORITY + "/word");
    }
}
/**
 *
 */
package com.android;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;

/**
 * @version  1.0
 */
public class DictProvider extends ContentProvider
{
    private static UriMatcher matcher
        = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int WORDS = 1;
    private static final int WORD = 2;
    private MyDatabaseHelper dbOpenHelper;
    static
    {
        // 为UriMatcher注册两个Uri
        matcher.addURI(Words.AUTHORITY, "words", WORDS);
        matcher.addURI(Words.AUTHORITY, "word/#", WORD);
    }
    // 第一次调用该DictProvider时,系统先创建DictProvider对象,并回调该方法
    @Override
    public boolean onCreate()
    {
        dbOpenHelper = new MyDatabaseHelper(this.getContext(), "myDict.db3", 1);
        return true;
    }
    // 插入数据方法
    @Override
    public Uri insert(Uri uri, ContentValues values)
    {
        // 获得数据库实例
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
        // 插入数据,返回行ID
        long rowId = db.insert("dict", Words.Word._ID, values);
        // 如果插入成功返回uri
        if (rowId > 0)
        {
            // 在已有的 Uri的后面追加ID数据
            Uri wordUri = ContentUris.withAppendedId(uri, rowId);
            // 通知数据已经改变
            getContext().getContentResolver().notifyChange(wordUri, null);
            return wordUri;
        }
        return null;
    }
    // 删除数据的方法
    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs)
    {
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
        // 记录所删除的记录数
        int num = 0;
        // 对于uri进行匹配。
        switch (matcher.match(uri))
        {
            case WORDS:
                num = db.delete("dict", selection, selectionArgs);
                break;
            case WORD:
                // 解析出所需要删除的记录ID
                long id = ContentUris.parseId(uri);
                String where = Words.Word._ID + "=" + id;
                // 如果原来的where子句存在,拼接where子句
                if (selection != null && !selection.equals(""))
                {
                    where = where + " and " + selection;
                }
                num = db.delete("dict", where, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("未知Uri:" + uri);
        }
        // 通知数据已经改变
        getContext().getContentResolver().notifyChange(uri, null);
        return num;
    }
    // 修改数据的方法
    @Override
    public int update(Uri uri, ContentValues values, String selection,
        String[] selectionArgs)
    {
        SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
        // 记录所修改的记录数
        int num = 0;
        switch (matcher.match(uri))
        {
            case WORDS:
                num = db.update("dict", values, selection, selectionArgs);
                break;
            case WORD:
                // 解析出想修改的记录ID
                long id = ContentUris.parseId(uri);
                String where = Words.Word._ID + "=" + id;
                // 如果原来的where子句存在,拼接where子句
                if (selection != null && !selection.equals(""))
                {
                    where = where + " and " + selection;
                }
                num = db.update("dict", values, where, selectionArgs);
                break;
            default:
                throw new IllegalArgumentException("未知Uri:" + uri);
        }
        // 通知数据已经改变
        getContext().getContentResolver().notifyChange(uri, null);
        return num;
    }
    // 查询数据的方法
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
        String[] selectionArgs, String sortOrder)
    {
        SQLiteDatabase db = dbOpenHelper.getReadableDatabase();
        switch (matcher.match(uri))
        {
            case WORDS:
                // 执行查询
                return db.query("dict", projection, selection, selectionArgs,
                    null, null, sortOrder);
            case WORD:
                // 解析出想查询的记录ID
                long id = ContentUris.parseId(uri);
                String where = Words.Word._ID + "=" + id;
                // 如果原来的where子句存在,拼接where子句
                if (selection != null && !"".equals(selection))
                {
                    where = where + " and " + selection;
                }
                return db.query("dict", projection, where, selectionArgs, null,
                    null, sortOrder);
            default:
                throw new IllegalArgumentException("未知Uri:" + uri);
        }
    }
    // 返回指定uri参数对应的数据的MIME类型
    @Override
    public String getType(Uri uri)
    {
        switch (matcher.match(uri))
        {
            // 如果操作的数据是多项记录
            case WORDS:
                return "vnd.android.cursor.dir/org.crazyit.dict";
                // 如果操作的数据是单项记录
            case WORD:
                return "vnd.android.cursor.item/org.crazyit.dict";
            default:
                throw new IllegalArgumentException("未知Uri:" + uri);
        }
    }
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, string
, broadcastreceiver
, uri
, 通话记录
, android 后台服务
, openfileoutput
, import
, public
, sqliteopenhelper
, java 解析 word
, sqlitedatabase
, selection
Android监听器
broadcastreceiver、broadcast receiver、broadcastreceiver类、view监听 broadcast、如何监听别人手机通话,以便于您获取更多的相关知识。

时间: 2024-09-17 20:29:23

android如何使用BroadcastReceiver后台实现来电通话记录的监听的相关文章

android如何在另一个方法里面调用ExpandableListView的监听方法

问题描述 android如何在另一个方法里面调用ExpandableListView的监听方法 我想在别的地方(比如button的click监听方法里面) 来控制listView的一级子菜单的收缩和展开,一级二级子菜单的选定. 新人报道 ,求大神... 解决方案 这是动态监听expandableListView的高度,你可以参考下. 在button的click中监听,可以吧ListView的点击事件提出来写,在button的click中调用 setListViewHeightBasedOnChi

Android新病毒:可窃取用户通话记录

Android新病毒可窃取用户通话记录 [TechWeb报道]8月3日消息,据国外媒体报道,Android曝出一款新的木马病毒,能记录用户的通话记录. CA Technolgies的移动恶意软件研究专家Dinesh Venkatesan表示,Android程序包将用户的通话记录生成为.amr文件,该文件随后被存储在移动设备的SD卡上.一旦恶意软件出现在用户的设备中,它会释放一个"配置"文件,包含关于远程服务器的关键信息,表明通话记录将被上传至一个服务器,恶意软件背后的黑客可随后访问这些

Android开发之PullToRefresh的Click点击事件的监听实现长按删除Item

本文为原创博客,出自http://blog.csdn.net/minimicall 到今天为止,搜芽的卖家版本应该来说已经基本完成,攻坚克难的一路过来.速度也控制的比较好. 项目过程进度 从任务分配量上来看,基本还是我个人英雄主义.接下来这样不行.但暂时也没办法,师弟还需要一个学习的过程.智质不错,而且态度端正.相信搜芽买家,他就可以承担更多的开发任务了. 接下来进入正题,说我们的PullToRefresh的点击事件.其实,我是想做长按进入删除的. 见效果图.当然这个是我做出来之后的了,但做出来

Android项目类似淘宝 电商 搜索功能,监听软键盘搜索事件,延迟自动搜索,以及时间排序的搜索历史记录的实现_Android

最近跳槽去新公司,接受的第一个任务是在 一个电商模块的搜索功能以及搜索历史记录的实现. 需求和淘宝等电商的功能大体差不多,最上面一个搜索框,下面显示搜索历史记录.在EditText里输入要搜索的关键字后,按软键盘的搜索按键/延迟xxxxms后自动搜索.然后将搜索的内容展示给用户/提示用户没有搜到相关信息. 历史记录是按时间排序的,最新的在前面,输入以前搜索过的关键字,例如牛仔裤(本来是第二条),会更新这条记录的时间,下次再看,牛仔裤的排列就在第一位了.并且有清除历史记录的功能. 整理需求,大致需

iphone6怎么关闭后台中最近通话记录?

1.在ios8界面中我们点击主界面的"设置"图标,如图所示 2.再接着我们找到"邮件.通讯录.日历"菜单点击它打开. 3.然后进入到"邮件.通讯录.日历"中之后我们再点击"在应用程序切换器中显示" 细节如图所示. 4.如图所示我们在"在应用程序切换器中显示"就可以进行设置了. 5.好了我们设置之后你在按两个home键看看是不是我们取消的东西不在这里显示了呀.

Android 自定义EditText实现粘贴,复制,剪切的监听

package com.dwtedx.qq.view; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.ContextMenu; import android.view.MenuItem; import android

Android 当数据库变动时更新UI数据 注册观察者监听

/** * Register an observer for provider status changes - we will need to * reflect them in the UI. */ private void registerObserver() { getContentResolver().registerContentObserver( ContactsContract.Contacts.CONTENT_URI, true, mObserver); getContentR

Android组件系列----BroadcastReceiver广播接收器

[正文] 一.广播的功能和特征 广播的生命周期很短,经过调用对象-->实现onReceive-->结束,整个过程就结束了.从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码.广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期.所以有的时候我们可以把它当做函数看也未必不可. 和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的.也不推荐在里面开子线程,因为往往

android环信应用在后台怎么监听新消息

问题描述 在设置了options.setShowNotificationInBackgroud(true)的情况下,环信demo中的例子在小米4上的消息提示数量永远都是1,在有些手机上直接没有提示,我想自己写消息提示这块的功能,但没找到app在后台时环信是怎么监听消息的? 解决方案 你去看看HXNotifier这个类,就知道了