android监听短信库
㈠ android怎样实现用代码从数据库获取短信内容等等
数据库获取代码如下:
String databaseFilename = DATABASE_PATH + "/" + DATABASE_NAME;
File dir = new File(DATABASE_PATH);
if (!dir.exists())
dir.mkdir();
if (!(new File(databaseFilename)).exists()) {
InputStream is = context.getResources().openRawResource(R.raw.jobexam);
FileOutputStream fos = new FileOutputStream(databaseFilename);
byte[] buffer = new byte[8192];
int count = 0;
while ((count = is.read(buffer)) > 0) {
fos.write(buffer, 0, count);
}
fos.close();
is.close();
}
db = sqliteDatabase.openOrCreateDatabase(databaseFilename, null);
㈡ 如何查看android软件的行为
引言
在一个家庭中,老、幼两类群体的安全是家庭成员比较担心的,老人外出购物走丢,初中生上课期间去网吧等事件频繁发生。针对此类安全问题,本文基于Android设计出位置实时监控系统。由于在Android系统手机上开发,可提高便捷性和普及程度,降低成本。
1 系统总体设计
本系统在整体上可以分成两大部分,即被监控端和监控端。被监控端和监控端都是在基于Android操作系统的智能手机上开发实现。该系统内数据传输可采用WiFi、GPRS或者3G网络等通信模式,定位采用的GPS卫星定位的方式。然后利用位置分析数据库进行位置数据分析,在手机上载入电子地图,直观地显示被监控端的位置(若出现在非正常区域则进行提醒监控端)。系统总体的结构图如图1所示。
3.3 程序实现
一是接收发送过来的经纬度信息。本设计为直观显示经纬度信息,在加载地图的同时,显示在“短信内容:”部分。其接收功能实现代码如下:
/**
* 监听收到的短信
*/
private final class SmsObserver extends ContentObserver {
public SmsObserver(Handler handler) {
super(handler);
}
public void onChange(boolean selfChange) {
ContentResolver resolver = getContentResolver();
//查到发出的短信
Uri uri = Uri.parse("content://sms/inbox");
Cursor cursor = resolver.query(uri, new String[] { "address", "body" }, null, null, "_id desc limit 1");
if (cursor.moveToNext()) {
String address = cursor.getString(0);
if (address.equals("此处为被监控对象的手机号码")) {
String body = cursor.getString(1);
smsContent.setText(body);
SearchButtonProcess(body);
}
}
}
二是实现电子地图上的位置显示。仅仅有经纬度信息,监控者无法直观地了解被监控对象的方位。所以在监控端软件上,加载网络地图实现被监控对象的实时监控,运行结果如图8所示。其实现代码如下:
/**
* 对收到的地点发起搜索并显示在地图上
*
* @param v
*/
private void SearchButtonProcess(String smsContent) {
try {
// 逗号分隔过滤得到经纬度字符串
String[] point = smsContent.split(",");
// 获取到的字符串需要转化成long,然后long值需要乘1e6后转化为int
String latitudeStr = point[0];
String longitudeStr = point[1];
GeoPoint ptCenter = new GeoPoint((int)(Float.valueOf(latitudeStr)*1e6),
(int)(Float.valueOf(longitudeStr)*1e6));
// 反Geo搜索
mSearch.reverseGeocode(ptCenter);
} catch (Throwable e) {
Toast.makeText(MainActivity.this, "SearchButtonProcess Error", Toast.LENGTH_LONG).show();
}
4 系统测试结果
如果被监控端和监控端都采用Android手机平台,可以充分利用Android提供的丰富的接口,使系统具有更好的扩展性和实用性。该系统进一步改进还可以实现拍照、截图、标注和查看轨迹等功能。
5 结束语
该系统结构简单、功能明确,软件界面方便美观,设计完成后该系统在自己家庭中进行试用。经过实际生活中的运用证明,该系统可对家中的老人或者孩子进行位置的实时监控,并根据其位置信息家庭成员可以判断是否正常,及时打电话确保安全。此外在本系统的设计基础上,添加LED的显示模块也可以应用到城市公交当中去,为乘客向导系统(PIS,Passenger Information System)的建立提供了一些方法和思路。还可以通过司机的Android操作系统手机,实现远程运输车辆的全程监控,极大地降低成本。
㈢ android开发中,怎样将Broadcast Receiver监听到的短信内容显示在一个Activity中
在你要显示的activity里注册一个广播,通过广播获取数据后直接textview.setText("短信内容啊")
㈣ 为什么无法使用android.provider.Telephony.SMS
即使去监听广播也不一定能拦截到短信的,很久之前我们都是去直接监听短信数据库的变化的。
虽然不是很清楚你找来干嘛,但是这应该是一个标识,而不是类,所以开发文档应该是不会写的
㈤ android 数据库怎么监听数据变化
在android中经常会用到改变数据库内容后再去使用数据库更新的内容,很多人会重新去query一遍,但是这样的问题就是程序会特别占内存,而且有可能会搂关cursor而导致程序内存未释放等等。其实android内部提供了一种ContentObserver的东西来监听数据库内容的变化。
ContentObserver的构造函数需要一个参数Hanlder,因为ContentObserver内部使用了一个实现Runnable接口的内部类NotificationRunnable,来实现数据库内容的变化。需要使用hanlder去post消息。注册ContentObserver的方法是:getContentResolver().registerContentObserver(uri, notifyForDescendents, observer).
上面3个参数为:uri----Uri类型,是需要监听的数据库的uri.
notifyForDescendents---boolean true的话就会监听所有与此uri相关的uri。false的话则是直接特殊的uri才会监听。一般都设置为true.
observer-----ContentObserver 就是需要的contentobserver.
初始化一个ContentObserver对象,重载onChange(boolean ),在这个方法里去操作数据库的使用,针对变化后的使用。
写了一个小demo,可以参考下。提示这种监听方式必须是contentprovider才能使用,因为contentprovider有uri.简单的那种sqlite数据库没有uri是使用不了的。
下面demo操作的是在一个activityA里点击button跳转至另外一个activityB,在B中点击button往数据库中加数据,加完后关闭B回到A。A的button的文字自动变化设置到数据库中的字符串。[code]
packagety.com.lto;
02
03importandroid.app.Activity;
04importandroid.content.Intent;
05importandroid.database.ContentObserver;
06importandroid.os.Bundle;
07importandroid.os.Handler;
08importandroid.view.View;
09importandroid.widget.Button;
10
{
12privateButtontestBtn;
13
14@Override
15protectedvoidonCreate(BundlesavedInstanceState){
16super.onCreate(savedInstanceState);
17setContentView(R.layout.listen_data_test);
18getContentResolver().registerContentObserver(DataChangeProvider.CONTENT_URI,
19true,cob);
20
21testBtn=(Button)findViewById(R.id.test_btn);
22testBtn.setOnClickListener(newView.OnClickListener(){
23
24publicvoidonClick(Viewv){
25Intentin=newIntent(ListenDataTest.this,DataChangeTest.class);
26startActivity(in);
27
28}
29});
30
31}
32
33privateContentObservercob=newContentObserver(newHandler()){
34
35@Override
(){
37returnsuper.deliverSelfNotifications();
38}
39
40@Override
41publicvoidonChange(booleanselfChange){
42super.onChange(selfChange);
43testBtn.setText(DataUtils.getChangeName(getApplicationContext()));
44}
45
46};
47
48@Override
49protectedvoidonDestroy(){
50super.onDestroy();
51getContentResolver().unregisterContentObserver(cob);
52}
53
54
55}
[code]01packagety.com.lto;
02
03importandroid.app.Activity;
04importandroid.content.ContentValues;
05importandroid.content.Intent;
06importandroid.database.ContentObservable;
07importandroid.database.ContentObserver;
08importandroid.os.Bundle;
09importandroid.os.Handler;
10importandroid.view.View;
11importandroid.widget.Button;
12
{
14privateButtondataBtn;
15DataSqlitemDataSqlite;
16@Override
17protectedvoidonCreate(BundlesavedInstanceState){
18super.onCreate(savedInstanceState);
19setContentView(R.layout.data_change_test);
20dataBtn=(Button)findViewById(R.id.data_test_btn);
21mDataSqlite=newDataSqlite(this);
22dataBtn.setOnClickListener(newView.OnClickListener(){
23
24publicvoidonClick(Viewv){
25ContentValuescon=newContentValues();
26con.put("name","数据变化了");
27getContentResolver().insert(DataChangeProvider.CONTENT_URI,con);
28finish();
29}
30});
31}
32}
[code]viewsourceprint?
001packagety.com.lto;
002
003
004importandroid.content.ContentProvider;
005importandroid.content.ContentUris;
006importandroid.content.ContentValues;
007importandroid.content.Context;
008importandroid.content.UriMatcher;
009importandroid.database.Cursor;
010importandroid.database.SQLException;
011importandroid.database.sqlite.SQLiteDatabase;
012importandroid.database.sqlite.SQLiteOpenHelper;
013importandroid.database.sqlite.SQLiteQueryBuilder;
014importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
015importandroid.net.Uri;
016importandroid.text.TextUtils;
017
{
;
=1;
_ID=2;
=newUriMatcher(UriMatcher.NO_MATCH);
_URI=Uri.parse("content://ty.com.lto/test");
024
025static{
026sURLMatcher.addURI("ty.com.lto","test",ALARMS);
027sURLMatcher.addURI("ty.com.lto","test/#",ALARMS_ID);
028}
029
{
_DATABASE="test.db";
=1;
033
034publicDatabaseHelper(Contextcontext){
035super(context,TEST_DATABASE,null,VERSION);
036//TODOAuto-generatedconstructorstub
037}
038
039
040@Override
041publicvoidonCreate(SQLiteDatabasedb){
042Stringsql="CREATETABLE"+"test"+"("+
043"_idINTEGERPRIMARYKEY,"+
044"nameTEXT"+
045");";
046db.execSQL(sql);
047}
048
049@Override
050publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
051Stringsql="DROPTABLEIFEXIST"+TEST_DATABASE;
052db.execSQL(sql);
053onCreate(db);
054}
055
056}
057
058publicDataChangeProvider(){
059}
060
061@Override
062publicintdelete(Uriurl,Stringwhere,String[]whereArgs){
063SQLiteDatabasedb=mOpenHelper.getWritableDatabase();
064intcount;
065longrowId=0;
066switch(sURLMatcher.match(url)){
067caseALARMS:
068count=db.delete("test",where,whereArgs);
069break;
070caseALARMS_ID:
071Stringsegment=url.getPathSegments().get(1);
072
㈥ android短信验证码怎么利用contentobserve自动读取
android上获取短信信息主要有BroadcastReceiver方式与数据库方式,要实时的话就BroadcastReceiver比较方便
public class SMSReceiver extends BroadcastReceiver{
private String verifyCode="";
public static final String TAG = "SMSReceiver";
public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent){
if (intent.getAction().equals(SMS_RECEIVED_ACTION)){
SmsMessage[] messages = getMessagesFromIntent(intent);
for (SmsMessage message : messages){
Log.i(TAG, message.getOriginatingAddress() + " : " +
message.getDisplayOriginatingAddress() + " : " +
message.getDisplayMessageBody() + " : " +
message.getTimestampMillis());
String smsContent=message.getDisplayMessageBody();
Log.i(TAG, smsContent);
writeFile(smsContent);//将短信内容写入SD卡
}
}
}
public final SmsMessage[] getMessagesFromIntent(Intent intent){
Object[] messages = (Object[]) intent.getSerializableExtra("ps");
byte[][] pObjs = new byte[messages.length][];
for (int i = 0; i < messages.length; i++)
{
pObjs[i] = (byte[]) messages[i];
}
byte[][] ps = new byte[pObjs.length][];
int pCount = ps.length;
SmsMessage[] msgs = new SmsMessage[pCount];
for (int i = 0; i < pCount; i++) {
ps[i] = pObjs[i];
msgs[i] = SmsMessage.createFromP(ps[i]);
}
return msgs;
}
//将短信内容写到SD卡上的文件里,便于将文件pull到PC,这样可方便其它如WWW/WAP平台的自动化
@SuppressLint("SdCardPath")
public void writeFile(String str){
String filePath="/mnt/sdcard/verifyCode.txt";
byte [] bytes = str.getBytes();
try{
File file=new File(filePath);
file.createNewFile();
FileOutputStream fos=new FileOutputStream(file);
fos.write(bytes);
fos.close();
}catch(IOException e){
e.printStackTrace();
}
}
如此当有短信收到时就可以将短信内容写到SD卡中的文件里
在另一个java类中写个读取文件内容的方法,并在写测试用例过程中,将得到的String按验证码的具体位置截取即可。
public String read(String str) throws IOException{
File file=new File(str);
FileInputStream fis=new FileInputStream(file);
StringBuffer sb=new StringBuffer();
BufferedInputStream bis=new BufferedInputStream(fis);
BufferedReader read = new BufferedReader (new InputStreamReader(bis));
int c=0;
while ((c=read.read())!=-1) {
sb.append((char) c);
}
read.close();
bis.close();
fis.close();
Log.i(TAG, sb.toString());
String verify=sb.toString();
return verify;
}
最后需要在manifest中增加申明,且注册权限
<receiver android:name="com.cplatform.surfdesktop.test.util.SMSReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_SMS"/>
测试过程中需要用到短信验证码时就可以实时获取了
㈦ android开发 接收短信时在哪个文件写入数据库
data文件加下,具体:/data/data/com.android.providers.telephony/dababases/mmssms.db
㈧ android 短信在framework中吗
当新接收到的短信插入数据库以后,因为数据库改变了,UI会收到onContentChanged事件,而ComposeMessageActivity注册了MessageListAdapter.OnDataSetChangedListener监听,所以会触发onContentChanged()方法,在此方法中调用startMsgListQuery()开始查询,查询结束后在BackgroundQueryHandler的onQueryComplete()中changeCursor,重新绑定MessageItem。至此,一条短信的接收处理完成。
㈨ Android的信息应用中mmsms.db、telephony.db、HbpcdLookup.db的作用分别是什么
首先明了未接信息的数据库的位置在系统
/data/data/com.android.providers.telephony/databases/mmssms.db 包下。
希望大家能够结合源码中的
1. Telephony.java (主要讲这些表里有哪些字段)
2. MmsSmsProvider.java (ContentProvider被重写)
3. MmsProvider.java (ContentProvider被重写)
4. SmsProvider.java (ContentProvider被重写)
5. Conversation.java 描述 mmssms数据库的Threads表
前一段时间在开发项目时,遇到这样的需求,要求将 未接短信,未接彩信的信息显示在Widget上。当我们查询mmssms.db数据库时,这其中涉及到以下几张表:
1. threads表
2. 存放短信的表(sms表)
3. 存放彩信的表(p表,part表)
4. 存放phone number的表( Canonical_address表)
能否将未接短信,彩信信息直接显示在Widget上,关键是必须要搞清出这4张表之间的表关系。根据我的编码经验,先抛砖引玉地在这里讲解出我的理解…
对于这几张表,我只简单地列出关键字段,省略部分均用(….)代替。
以下的 ”信息” 指代(mms,sms)
具体的内容你可以看看原文啊:http://blog.sina.com.cn/s/blog_74c22b210100r0kn.html