玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息...

项目的Github地址:https://github.com/ggrcwxh/LastTime

采用基于git的多人协作开发模式

软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了。第一轮先实现查询通话记录返回对应号码上一次的通话时间。

真机测试下的效果图:显示称呼和上一次通话距离现在的时间,单位小时

API接口:

 首先需要创建一个LastTimeDatabaseHelper的对象来创建数据库,建议创建在mainActivity下,创建建议格式如下,传入参数为全局Context;数据库名;允许返回自定义的Cursor,一般填null,当前数据库版本号

public LastTimeDatabaseHelper dbHelper= new LastTimeDatabaseHelper(MyApplication.getContext(),"lasttime.db",null,1); 

关于设置亲情号码:建议格式如下:传入参数分别为称呼,电话号码,以及dbHelper

KithAndKinService test =new KithAndKinService("mother","111111",dbHelper);
test.insertToDatabase();

关于删除亲情号码:建议格式如下:传入参数为称呼以及dbHelper

KithAndKinService test2 =new KithAndKinService("mother",dbHelper);
test2.deleteInDatabase()

 关于更新数据库通话记录时间,建议格式如下:

CallInfoService call = new CallInfoService(dbHelper);
call.getCallInfos();
call.dataProcessing();

关于查看上一次通话记录时间,建议格式如下,l1为上次通话时间-1970年1月1日 的时长的毫秒数,请在activity上获取当前时间再减去l1,建议获取方法System.currentTimeMillis()

 KithAndKinService test3 =new KithAndKinService("mother",dbHelper);
Map<String,String> map1 =  test3.seleteInDatabase();
long l1 = Long.valueOf(map1.get("date"));

 

实现方法:

因为我不写activity,那么我写的功能就要脱离activity了。那么首先要做的就是获取全局Context。

实现的话挺简单的,就是要先理解Context的含义,我是通过看http://www.jianshu.com/p/94e0f9ab3f1d(Context都没弄明白,还怎么做Android开发?)这篇简书理解的。不是主要玩安卓开发的,碰到安卓这些特性还是挺头疼的。实现方法就是写一个Application的子类,然后修改AndroidMainifest.xml。公式化的方法了。实现后就可以通过调用,MyApplication.getContext()获取全局Context了,具体代码如下:

 1 public class MyApplication extends Application {
 2     private static Context context;
 3     @Override
 4     public void onCreate(){
 5         context=getApplicationContext();
 6     }
 7     public static Context getContext() {
 8         return context;
 9     }
10 }
1 android:name=".MyApplication"//在<application></application>中插入

然后就是建立数据库了,用安卓内置的SQLite。讲道理,一般用Litepal来操纵数据库会简单很多,但话又说回来了,我又不是主玩安卓开发的,学习这东西还是从底层开始比较容易懂,所以这里用SQLiteDatabase来操控数据库。

建立数据库:公式化的方法,两个方法是重写SQLiteOpenHelper里的方法,一个用在创建整个数据库的时候,一个用在给数据库升级的时候(比如插入新表)。

 1 public class LastTimeDatabaseHelper extends SQLiteOpenHelper{
 2     public static final String CREATE_KITH_AND_KIN = "create table KITH_AND_KIN ("
 3             + "call text primary key, "
 4             +"num text,"
 5             +"date integer)";
 6 
 7     public LastTimeDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
 8         super(context,name,factory,version);
 9 
10     }
11 
12     @Override
13     public void onCreate(SQLiteDatabase sqLiteDatabase) {
14         sqLiteDatabase.execSQL(CREATE_KITH_AND_KIN);
15     }
16 
17     @Override
18     public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
19 
20     }
21 }

 增删改查:主要是采用SQLiteDatabase提供的insert()等方法

public class KithAndKinService {
private String call;
private String num;
private long date;
private LastTimeDatabaseHelper dbHelper;
public KithAndKinService(String call,String num,long date,LastTimeDatabaseHelper dbHelper) {
this.call=call;
this.num=num;
this.date=date;
this.dbHelper=dbHelper;
}
public KithAndKinService(String call, String num, LastTimeDatabaseHelper dbHelper) {
this.call=call;
this.num=num;
this.dbHelper=dbHelper;
}
public KithAndKinService(String call,LastTimeDatabaseHelper dbHelper)
{
this.call=call;
this.dbHelper=dbHelper;
}
public KithAndKinService(String call,long date,LastTimeDatabaseHelper dbHelper){
this.call=call;
this.date=date;
this.dbHelper=dbHelper;
}
public KithAndKinService(LastTimeDatabaseHelper dbHelper)
{
this.dbHelper=dbHelper;
}
public void insertToDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("call",call);
values.put("num",num);
if(date!=0)
{
values.put("date",date);
}

db.insert("KITH_AND_KIN",null,values);
}
public void deleteInDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.delete("KITH_AND_KIN","call=?",new String[] {call});
}
public Map<String,String> seleteInDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
String temp = "call=?";
String[] temp2 ={call};
String[] temp3 ={"call","num","date"};
Cursor cursor = db.query("KITH_AND_KIN",temp3,temp,temp2,null,null,null);
Map<String,String> map = new HashMap<String,String>();
if (cursor != null && cursor.moveToFirst())
{
map.put("call",cursor.getString(0));
map.put("num",cursor.getString(1));
map.put("date", String.valueOf(cursor.getLong(2)));
}


return map;
}
public List<Map<String,String>> seleteInDatabaseAll(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
Cursor cursor = db.query("KITH_AND_KIN",null,null,null,null,null,null);
List<Map<String,String>> list= new ArrayList<Map<String,String>>();

if (cursor != null && cursor.moveToFirst()) {
do {
Map<String,String> map = new HashMap<String,String>();
map.put("call",cursor.getString(cursor.getColumnIndex("call")));
map.put("num",cursor.getString(cursor.getColumnIndex("num")));
map.put("date",cursor.getString(cursor.getColumnIndex("date")));
list.add(map);


} while (cursor.moveToNext());

}

return list;
}
public void updateToDatabase(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("date",date);
db.update("KITH_AND_KIN",values,"call=?",new String[] {call});
}

}

 然后是读取用户的通话记录

首先要权限

<uses-permission android:name="android.permission.READ_CALL_LOG" />

 然后就是读取通话记录了:主要是读取用resolver.query读取通话记录的数据库,然后更新数据库

 
public class CallInfoService {
private List<CallInfo> callinfos = new ArrayList<CallInfo>();
private LastTimeDatabaseHelper dbHelper;
public List<CallInfo> getCallinfos() {
return callinfos;
}
public CallInfoService(LastTimeDatabaseHelper dbHelper){
this.dbHelper=dbHelper;
}
public void getCallInfos() {

ContentResolver resolver = MyApplication.getContext().getContentResolver();
Uri uri = CallLog.Calls.CONTENT_URI;
String[] projection = new String[]{
CallLog.Calls.NUMBER,
CallLog.Calls.DATE,
CallLog.Calls.TYPE
};
if (ActivityCompat.checkSelfPermission(MyApplication.getContext(), Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
return ;
}
Cursor cursor = resolver.query(uri, projection, null, null, null);
while (cursor.moveToNext()){
if(cursor.getInt(2)==2)//OUTGOING_TYPE=2
{
String number=cursor.getString(0);
long date = cursor.getLong(1);
boolean flag=false;
for(CallInfo attribute:callinfos)
{

if(attribute.getNumber().equals(number)) {
if(attribute.getDate()<date)
{
attribute.setDate(date);
flag=true;
break;
}
}


}
if(flag==false)
{
CallInfo temp = new CallInfo(number,date);
callinfos.add(temp);
}


}
}
cursor.close();


}
public void dataProcessing(){
KithAndKinService kaks = new KithAndKinService(dbHelper);
List<Map<String,String>> all= kaks.seleteInDatabaseAll();
for(CallInfo attribute : callinfos)
{
for(int i =0 ;i<all.size();i++)
{
if(attribute.getNumber().equals(all.get(i).get("num")))
{
KithAndKinService temp = new KithAndKinService(all.get(i).get("call"),all.get(i).get("num"),attribute.getDate(),dbHelper);
temp.updateToDatabase();
}
}
}
}

}

 下一节预告:读取图片exif信息,获取拍摄日期经纬度,确定大致位置

转载于:https://www.cnblogs.com/wkmocr/p/7676444.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571821.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm垃圾回收机制_深入理解JVM的垃圾回收机制

​如何判断对象已“死”Java堆中存放着几乎所有的对象实例&#xff0c;垃圾回收器在堆进行垃圾回收前&#xff0c;首先要判断这些对象那些还存活&#xff0c;那些已经“死去”。判断对象是否已“死”有如下几种算法&#xff1a;1引用计数法引用计数法描述的算法为&#xff1a;给…

chown -r oracle:oinstall /oracle,CentOS7安装Oracle12c图文详解

root身份安装依赖包&#xff1a; yum -y install binutils compat-libcap1 compat-libstdc-33 compat-libstdc-33*.i686 elfutils-libelf-devel gcc gcc-c glibc*.i686 glibc glibc-devel glibc-devel*.i686 ksh libgcc*.i686 libgcc libstdc libstdc*.i686 libstdc-devel li…

在苹果笔记本如何使用python_mac下如何将python2.7改为python3

1.查看当前电脑python版本 python -V // 显示2.7.x 2.用brew升级python brew update python 3.如果安装成功&#xff0c;去系统目录下回看到两个版本的python cd usr/local/Cellar/ //到此目录下 cd python/ //进入python目录下 查看已安装的python版本&#xff0c;如果有2.x 和…

[BZOJ1834][ZJOI2010]network 网络扩容 最大流+费用流

1834: [ZJOI2010]network 网络扩容 Time Limit: 3 Sec Memory Limit: 64 MB Submit: 3330 Solved: 1739 [Submit][Status][Discuss]Description 给定一张有向图&#xff0c;每条边都有一个容量C和一个扩容费用W。这里扩容费用是指将容量扩大1所需的费用。求&#xff1a; 1、 …

python需要花钱下载吗_用Python下载知乎视频,非常实用

原标题&#xff1a;用Python下载知乎视频&#xff0c;非常实用Python下载知乎视频。 # -*- coding: utf-8 -*- """ 下载知乎视频&#xff1a; 依赖&#xff1a; pip install requests mac 安装 ffmpeg: brew install ffmpeg """ import re impor…

python相比于excel的优势_对照Excel使用Python进行数据分析,更快掌握

Excel和Python&#xff0c;作为数据分析的主流工具&#xff0c;在从效率提升到数据商业化的整个过程中&#xff0c;都起到了重要作用。不管是在Excel中通过鼠标点选实现&#xff0c;亦或是利用Python通过代码实现&#xff0c;数据分析中的很多基础功能都是相通的。 在数据量级大…

python二维图颜色函数_Python scipy的二维图像卷积运算与图像模糊处理操作示例

本文实例讲述了Python scipy的二维图像卷积运算与图像模糊处理操作。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 二维图像卷积运算 一 代码 import numpy as np from scipy import signal, misc import matplotlib.pyplot as plt image misc.ascent()#二维图像数组…

linux命令行大全 笔记,《Linux命令行大全》读书笔记

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;shell就是一个程序&#xff0c;它接受从键盘输入的命令&#xff0c;然后把命令传递给操作系统执行。当使用图像用户界面时&#xff0c;我们需要一个叫做终端仿真器…

dedecms 添加,编辑文章时 文章标题有字数限制的解决办法。

百度上说 解决方法有两步&#xff1a; 一、先要在系统参数下的其他选项中修改文档标题最大长度&#xff08;如修改为150&#xff09;&#xff0c; 后台系统 - 其它选项 - 文档标题最大长度 默认的是60改为150&#xff0c; 二、修改默认参数后&#xff0c;需要手工修改数据表。 …

python绘制散点图、如何选两列作为横坐标_在matplotlib散点图(水平杆图)中从x=0到数据点绘制水平线...

考虑以下情节&#xff1a;由此函数生成&#xff1a;def timeDiffPlot(dataA, dataB, savetoNone, legNone): labels list(dataA["graph"]) figure(figsizescreenMedium) ax gca() ax.grid(True) xi range(len(labels)) rtsA dataA["running"] / 1000.0…

python运行命令_Python中执行外部命令

有很多需求需要在Python中执行shell命令、启动子进程&#xff0c;并捕获命令的输出和退出状态码&#xff0c;类似于Java中的Runtime类库。 subprocess模块的使用&#xff1a; Python使用最广泛的是标准库的subprocess模块&#xff0c;用来替换os.system(),os.spawn*(),os.popen…

linux多选项菜单脚本,linux shell 编写菜单脚本事例

menu2文件代码&#xff1a;---#!/bin/sh#menu2#Main menu script#ignore ctrl-c and QUIT interruptstrap "" 2 3 15MYDATEdate %d/%m/%YTHIS_HOSThostname -sUSERwhoami#user level fileUSER_LEVELSpriv.user#hold fileHOLD1hold1.$$#colour functionfunction colou…

python简单爬虫入门一_Python爬虫快速入门:基本结构简单实例

本爬虫系列入门教程假设读者仅有一点点Python基础或者近乎为零的基础。如果是有Python基础的可以跳过一些对于Python基本知识的补充。 爬虫能干什么呢&#xff1f;一句话概括&#xff0c;正常通过浏览器可以获取的数据&#xff0c;爬虫都可以获取。这句话可以说是包罗万象。一是…

Windows下rocketmq mqnamesrv.exe 启动成功,但是mqbroker.exe启动失败

1、mqnamesrv.exe启动成功 2、启动mqbroker.exe失败 解决办法&#xff0c;删除C:\Users\"当前系统用户名"\store下的所有文件&#xff0c;就可以了转载于:https://www.cnblogs.com/roujingchuxia/p/7685796.html

python加入中小学课程_通知:中小学将新增一门课!对2008-2013年出生的孩子影响最大!...

很多家长都在发愁&#xff1a; “现在孩子竞争这么激烈&#xff0c;奥数、外语、舞蹈、钢琴...样样都行&#xff0c;我该让孩子学点什么&#xff0c;才不会被同龄人甩下&#xff1f;” 其实&#xff0c;人工智能时代&#xff0c;孩子们的竞争战地正在转到——少儿编程&#xff…

linux --- vsftp

vsftp 一、简介与原理 1、VSFTP&#xff08;very secuery file tranfer protocol&#xff09; 2、主动模式&#xff1a; 3、被动模式&#xff1a; 4、服务器程序&#xff1a; > vsftpd 5、install&#xff1a; >vaftpd-2.2.2-11.e16.i686.rpm >yum -y install vsftpd …

go tcp客户端自动重连_使用 Go 语言创建 WebSocket 服务

今天介绍如何用 Go 语言创建 WebSocket 服务&#xff0c;文章的前两部分简要介绍了 WebSocket 协议以及用 Go 标准库如何创建 WebSocket 服务。第三部分实践环节我们使用了 gorilla/websocket 库帮助我们快速构建 WebSocket 服务&#xff0c;它帮封装了使用 Go 标准库实现 WebS…

linux系统终端more,一篇文章让你学透Linux系统中的more命令

Linux系统下有很多实用工具可以让你在终端界面查看文本文件。其中一个就是 more。more 跟我之前另一篇文章里写到的工具 —— less 很相似。它们之间的主要不同点在于 more 只允许你向前查看文件。尽管它能提供的功能看起来很有限&#xff0c;不过它依旧有很多有用的特性值得你…

python项目开发案例集锦_在线分享 | 在 VS Code 中一站式完成 Python 项目开发

往期活动回顾VS Code 中文社区自成立以来&#xff0c;已经举办了4场活动&#xff1a;Workshop &#xff5c; First Step to VS Code 基础篇 Workshop &#xff5c; First Step to VS Code 进阶篇 在线沙龙 &#xff5c; 程序员职业生涯如何不迷茫 干货回顾 &#xff5c; VS Cod…

jvm--Garbage Collection

垃圾回收&#xff08;GC&#xff09;一直是java语言的重中之重。 1 对象状态鉴别 1.1 标记对象是否可回收一般有两种算法&#xff1a; 引用计数算法&#xff1a;给每个对象添加一个引用计数器&#xff0c;当引用一次时1&#xff0c;当引用时效时-1&#xff0c;当计数器为0时即可…