Android SMS —— 读取短信 联系人

Android SMS(一) —— 读取短信

分类: Android   9551人阅读  评论(9)  收藏  举报
sms android integer string date 数据库

Android SMS Read

[java]  view plain copy print ?
  1. package com.homer.sms;  
  2.   
  3. import java.sql.Date;  
  4. import java.text.SimpleDateFormat;  
  5.   
  6.   
  7. import android.app.Activity;  
  8. import android.database.Cursor;  
  9. import android.database.sqlite.SQLiteException;  
  10. import android.net.Uri;  
  11. import android.os.Bundle;  
  12. import android.util.Log;  
  13. import android.widget.ScrollView;  
  14. import android.widget.TableLayout;  
  15. import android.widget.TextView;  
  16.   
  17. /** 
  18.  * 读取手机短信 
  19.  *  
  20.  * @author sunboy_2050 
  21.  * @since  http://blog.csdn.net/sunboy_2050 
  22.  * @date   2012.03.06 
  23.  */  
  24. public class smsRead extends Activity {  
  25.   
  26.     @Override  
  27.     public void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.   
  30.         TextView tv = new TextView(this);  
  31.         tv.setText(getSmsInPhone());  
  32.   
  33.         ScrollView sv = new ScrollView(this);  
  34.         sv.addView(tv);  
  35.           
  36.         setContentView(sv);  
  37.     }  
  38.   
  39.     public String getSmsInPhone() {  
  40.         final String SMS_URI_ALL = "content://sms/";  
  41.         final String SMS_URI_INBOX = "content://sms/inbox";  
  42.         final String SMS_URI_SEND = "content://sms/sent";  
  43.         final String SMS_URI_DRAFT = "content://sms/draft";  
  44.         final String SMS_URI_OUTBOX = "content://sms/outbox";  
  45.         final String SMS_URI_FAILED = "content://sms/failed";  
  46.         final String SMS_URI_QUEUED = "content://sms/queued";  
  47.   
  48.         StringBuilder smsBuilder = new StringBuilder();  
  49.   
  50.         try {  
  51.             Uri uri = Uri.parse(SMS_URI_ALL);  
  52.             String[] projection = new String[] { "_id""address""person""body""date""type" };  
  53.             Cursor cur = getContentResolver().query(uri, projection, nullnull"date desc");      // 获取手机内部短信  
  54.   
  55.             if (cur.moveToFirst()) {  
  56.                 int index_Address = cur.getColumnIndex("address");  
  57.                 int index_Person = cur.getColumnIndex("person");  
  58.                 int index_Body = cur.getColumnIndex("body");  
  59.                 int index_Date = cur.getColumnIndex("date");  
  60.                 int index_Type = cur.getColumnIndex("type");  
  61.   
  62.                 do {  
  63.                     String strAddress = cur.getString(index_Address);  
  64.                     int intPerson = cur.getInt(index_Person);  
  65.                     String strbody = cur.getString(index_Body);  
  66.                     long longDate = cur.getLong(index_Date);  
  67.                     int intType = cur.getInt(index_Type);  
  68.   
  69.                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  70.                     Date d = new Date(longDate);  
  71.                     String strDate = dateFormat.format(d);  
  72.   
  73.                     String strType = "";  
  74.                     if (intType == 1) {  
  75.                         strType = "接收";  
  76.                     } else if (intType == 2) {  
  77.                         strType = "发送";  
  78.                     } else {  
  79.                         strType = "null";  
  80.                     }  
  81.   
  82.                     smsBuilder.append("[ ");  
  83.                     smsBuilder.append(strAddress + ", ");  
  84.                     smsBuilder.append(intPerson + ", ");  
  85.                     smsBuilder.append(strbody + ", ");  
  86.                     smsBuilder.append(strDate + ", ");  
  87.                     smsBuilder.append(strType);  
  88.                     smsBuilder.append(" ]\n\n");  
  89.                 } while (cur.moveToNext());  
  90.   
  91.                 if (!cur.isClosed()) {  
  92.                     cur.close();  
  93.                     cur = null;  
  94.                 }  
  95.             } else {  
  96.                 smsBuilder.append("no result!");  
  97.             } // end if  
  98.   
  99.             smsBuilder.append("getSmsInPhone has executed!");  
  100.   
  101.         } catch (SQLiteException ex) {  
  102.             Log.d("SQLiteException in getSmsInPhone", ex.getMessage());  
  103.         }  
  104.   
  105.         return smsBuilder.toString();  
  106.     }  
  107. }  

AndroidManifest.xml 权限

 记得在AndroidManifest.xml中加入android.permission.READ_SMS这个permission

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


运行结果:


代码示例



URI主要有:

content://sms/               所有短信
content://sms/inbox        收件箱
content://sms/sent          已发送
content://sms/draft         草稿
content://sms/outbox     发件箱
content://sms/failed       发送失败
content://sms/queued    待发送列表


sms主要结构:  
  1. _id => 短消息序号 如100  
  2. thread_id => 对话的序号 如100  
  3. address => 发件人地址,手机号.如+8613811810000  
  4. person => 发件人,返回一个数字就是联系人列表里的序号,陌生人为null  
  5. date => 日期  long型。如1256539465022  
  6. protocol => 协议 0 SMS_RPOTO, 1 MMS_PROTO   
  7. read => 是否阅读 0未读, 1已读   
  8. status => 状态 -1接收,0 complete, 64 pending, 128 failed   
  9. type => 类型 1是接收到的,2是已发出   
  10. body => 短消息内容   
  11. service_center => 短信服务中心号码编号。如+8613800755500  
String[] projection = new String[]{"address", "body"};
Cursor cursor = getContentResolver().query(uri, projection, "where .." new String[]{"", ""}, "order by ..")


Android短信存储数据库

偶然发现了Android源码中的一个类MmsSmsDatabaseHelper.java,原来android将所有的短信信息都存入了mmssms.db中。

公开的SDK中没有这个类,不能直接使用。于是自己写了一个SQLiteOpenHelper,但是查询的时候发生SQL异常。看来不能为所欲为了,不过据网上资料介绍可以拷贝db文件来实现短信数据备份。

MmsSmsDatabaseHelper.java在Android源码中的路径:

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


sms数据库中的字段如下:

_id               一个自增字段,从1开始
thread_id    序号,同一发信人的id相同
address      发件人手机号码
person        联系人列表里的序号,陌生人为null 
date            发件日期
protocol      协议,分为: 0 SMS_RPOTO, 1 MMS_PROTO  
read           是否阅读 0未读, 1已读  
status         状态 -1接收,0 complete, 64 pending, 128 failed 
type     
    ALL    = 0;
    INBOX  = 1;
    SENT   = 2;
    DRAFT  = 3;
    OUTBOX = 4;
    FAILED = 5;
    QUEUED = 6;
 
body                     短信内容
service_center     短信服务中心号码编号
subject                  短信的主题
reply_path_present     TP-Reply-Path
locked    


sms数据库表字段类型的源码:

[java]  view plain copy print ?
  1. private void createSmsTables(SQLiteDatabase db) {  
  2.         // N.B.: Whenever the columns here are changed, the columns in  
  3.         // {@ref MmsSmsProvider} must be changed to match.  
  4.         db.execSQL("CREATE TABLE sms (" +  
  5.                    "_id INTEGER PRIMARY KEY," +  
  6.                    "thread_id INTEGER," +  
  7.                    "address TEXT," +  
  8.                    "person INTEGER," +  
  9.                    "date INTEGER," +  
  10.                    "date_sent INTEGER DEFAULT 0," +  
  11.                    "protocol INTEGER," +  
  12.                    "read INTEGER DEFAULT 0," +  
  13.                    "status INTEGER DEFAULT -1," + // a TP-Status value  
  14.                                                   // or -1 if it  
  15.                                                   // status hasn't  
  16.                                                   // been received  
  17.                    "type INTEGER," +  
  18.                    "reply_path_present INTEGER," +  
  19.                    "subject TEXT," +  
  20.                    "body TEXT," +  
  21.                    "service_center TEXT," +  
  22.                    "locked INTEGER DEFAULT 0," +  
  23.                    "error_code INTEGER DEFAULT 0," +  
  24.                    "seen INTEGER DEFAULT 0" +  
  25.                    ");");  
  26. ....  
  27. }  

packages/providers/TelephonyProvider/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java


联系人为空

短信数据库里面如果你是先受到陌生短信之后再把陌生人添加到联系人列表的话,短信数据库里面的person字段就为null,如果你是先添加联系人再发短信的话,短信数据库里面的person字段就不为空了,所以你要是想通过短信数据库里的字段取得联系人的其他信息的话,只能通过地址来取。



参考推荐:

Android SMS Messaging 

 

Android SMS(二)—— 读取短信保存到 SQLite

分类: Android   3925人阅读  评论(12)  收藏  举报
sms sqlite android date 数据库 string

Android 之 SMS 短信在Android系统中是保存在SQLite数据库中的,但不让其它程序访问(Android系统的安全机制)

现在我们在读取手机内的SMS短信,先保存在我们自己定义的SQLite数据库中,然后读取SQLite数据库提取短信,并显示


SMS短信SQLite存取代码:

[java]  view plain copy print ?
  1. package com.homer.sms;  
  2.   
  3. import java.sql.Date;  
  4. import java.text.SimpleDateFormat;  
  5.   
  6. import org.loon.wsi.R;  
  7.   
  8. import android.app.Activity;  
  9. import android.content.Context;  
  10. import android.database.Cursor;  
  11. import android.database.sqlite.SQLiteDatabase;  
  12. import android.graphics.Color;  
  13. import android.net.Uri;  
  14. import android.os.Bundle;  
  15. import android.util.Log;  
  16. import android.widget.TableLayout;  
  17. import android.widget.TableRow;  
  18. import android.widget.TableRow.LayoutParams;  
  19. import android.widget.TextView;  
  20.   
  21. /** 
  22.  * 读取手机短信, 先保存到SQLite数据,然后再读取数据库显示 
  23.  *  
  24.  * @author sunboy_2050 
  25.  * @since  http://blog.csdn.net/sunboy_2050 
  26.  * @date   2012.03.06 
  27.  */  
  28. public class smsRead4 extends Activity {  
  29.   
  30.     TableLayout tableLayout;  
  31.     int index = 0;  
  32.   
  33.     @Override  
  34.     public void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.   
  37.         setContentView(R.layout.main);  
  38.   
  39.         tableLayout = (TableLayout) findViewById(R.id.tableLayout);  
  40.         showSMS();  
  41.     }  
  42.   
  43.     private void showSMS() {  
  44.         SmsHander smsHander = new SmsHander(this);  
  45.   
  46.         smsHander.createSMSDatabase();                          // 创建SQLite数据库  
  47.         smsHander.insertSMSToDatabase();                        // 读取手机短信,插入SQLite数据库  
  48.         Cursor cursor = smsHander.querySMSInDatabase(100);      // 获取前100条短信(日期排序)  
  49.   
  50.         cursor.moveToPosition(-1);  
  51.         while (cursor.moveToNext()) {  
  52.             String strAddress = cursor.getString(cursor.getColumnIndex("address"));  
  53.             String strDate = cursor.getString(cursor.getColumnIndex("date"));  
  54.             String strBody = cursor.getString(cursor.getColumnIndex("body"));  
  55.   
  56.             SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  57.             Date date = new Date(Long.parseLong(strDate));  
  58.             strDate = dateFormat.format(date);  
  59.   
  60.             String smsTitle = strAddress + "\t\t" + strDate;  
  61.             String smsBody = strBody + "\n";  
  62.             Log.i("tableRow", smsTitle + smsBody);  
  63.   
  64.             // title Row  
  65.             TableRow trTitle = new TableRow(this);  
  66.             trTitle.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  67.   
  68.             TextView tvTitle = new TextView(this);  
  69.             tvTitle.setText(smsTitle);  
  70.             tvTitle.getPaint().setFakeBoldText(true); // 加粗字体  
  71.             tvTitle.setTextColor(Color.RED);  
  72.             tvTitle.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  73.             trTitle.addView(tvTitle);  
  74.             tableLayout.addView(trTitle, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));  
  75.   
  76.             // body Row  
  77.             TableRow trBody = new TableRow(this);  
  78.             trBody.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  79.   
  80.             TextView tvBody = new TextView(this);  
  81.             tvBody.setText(smsBody);  
  82.             tvBody.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));  
  83.             trBody.addView(tvBody);  
  84.             tableLayout.addView(trBody, new TableLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));  
  85.         }  
  86.   
  87.         if (!cursor.isClosed()) {  
  88.             cursor.close();  
  89.             cursor = null;  
  90.         }  
  91.   
  92.         smsHander.closeSMSDatabase();  
  93.         index = 0;  
  94.     }  
  95.   
  96.     public class SmsHander {  
  97.   
  98.         SQLiteDatabase db;  
  99.         Context context;  
  100.   
  101.         public SmsHander(Context context) {  
  102.             this.context = context;  
  103.         }  
  104.   
  105.         public void createSMSDatabase() {  
  106.             String sql = "create table if not exists sms("  
  107.                     + "_id integer primary key autoincrement,"  
  108.                     + "address varchar(255)," + "person varchar(255),"  
  109.                     + "body varchar(1024)," + "date varchar(255),"  
  110.                     + "type integer)";  
  111.             db = SQLiteDatabase.openOrCreateDatabase(context.getFilesDir().toString() + "/data.db3"null);         // 创建数据库  
  112.             db.execSQL(sql);  
  113.         }  
  114.   
  115.         // 获取手机短信  
  116.         private Cursor getSMSInPhone() {  
  117.             Uri SMS_CONTENT = Uri.parse("content://sms/");  
  118.             String[] projection = new String[] { "_id""address""person""body""date""type" };  
  119.             Cursor cursor = context.getContentResolver().query(SMS_CONTENT, projection, nullnull"date desc");   // 获取手机短信  
  120.   
  121.             while (cursor.moveToNext()) {  
  122.                 System.out.println("--sms-- : " + cursor.getString(cursor.getColumnIndex("body")));  
  123.             }  
  124.   
  125.             return cursor;  
  126.         }  
  127.   
  128.         // 保存手机短信到 SQLite 数据库  
  129.         public void insertSMSToDatabase() {  
  130.             Long lastTime;  
  131.             Cursor dbCount = db.rawQuery("select count(*) from sms"null);  
  132.             dbCount.moveToFirst();  
  133.             if (dbCount.getInt(0) > 0) {  
  134.                 Cursor dbcur = db.rawQuery("select * from sms order by date desc limit 1"null);  
  135.                 dbcur.moveToFirst();  
  136.                 lastTime = Long.parseLong(dbcur.getString(dbcur.getColumnIndex("date")));  
  137.             } else {  
  138.                 lastTime = new Long(0);  
  139.             }  
  140.             dbCount.close();  
  141.             dbCount = null;  
  142.   
  143.             Cursor cur = getSMSInPhone(); // 获取短信(游标)  
  144.             db.beginTransaction(); // 开始事务处理  
  145.             if (cur.moveToFirst()) {  
  146.                 String address;  
  147.                 String person;  
  148.                 String body;  
  149.                 String date;  
  150.                 int type;  
  151.   
  152.                 int iAddress = cur.getColumnIndex("address");  
  153.                 int iPerson = cur.getColumnIndex("person");  
  154.                 int iBody = cur.getColumnIndex("body");  
  155.                 int iDate = cur.getColumnIndex("date");  
  156.                 int iType = cur.getColumnIndex("type");  
  157.   
  158.                 do {  
  159.                     address = cur.getString(iAddress);  
  160.                     person = cur.getString(iPerson);  
  161.                     body = cur.getString(iBody);  
  162.                     date = cur.getString(iDate);  
  163.                     type = cur.getInt(iType);  
  164.   
  165.                     if (Long.parseLong(date) > lastTime) {  
  166.                         String sql = "insert into sms values(null, ?, ?, ?, ?, ?)";  
  167.                         Object[] bindArgs = new Object[] { address, person, body, date, type };  
  168.                         db.execSQL(sql, bindArgs);  
  169.                     } else {  
  170.                         break;  
  171.                     }  
  172.                 } while (cur.moveToNext());  
  173.   
  174.                 cur.close();  
  175.                 cur = null;  
  176.                 db.setTransactionSuccessful();  // 设置事务处理成功,不设置会自动回滚不提交  
  177.                 db.endTransaction();            // 结束事务处理  
  178.             }  
  179.   
  180.         }  
  181.   
  182.         // 获取 SQLite 数据库中的全部短信  
  183.         public Cursor querySMSFromDatabase() {  
  184.             String sql = "select * from sms order by date desc";  
  185.             return db.rawQuery(sql, null);  
  186.         }  
  187.   
  188.         // 获取 SQLite 数据库中的最新 size 条短信  
  189.         public Cursor querySMSInDatabase(int size) {  
  190.             String sql;  
  191.   
  192.             Cursor dbCount = db.rawQuery("select count(*) from sms"null);  
  193.             dbCount.moveToFirst();  
  194.             if (size < dbCount.getInt(0)) { // 不足 size 条短信,则取前 size 条  
  195.                 sql = "select * from sms order by date desc limit " + size;  
  196.             } else {  
  197.                 sql = "select * from sms order by date desc";  
  198.             }  
  199.             dbCount.close();  
  200.             dbCount = null;  
  201.   
  202.             return db.rawQuery(sql, null);  
  203.         }  
  204.   
  205.         // 获取 SQLite数据库的前 second秒短信  
  206.         public Cursor getSMSInDatabaseFrom(long second) {  
  207.             long time = System.currentTimeMillis() / 1000 - second;  
  208.             String sql = "select * from sms order by date desc where date > " + time;  
  209.             return db.rawQuery(sql, null);  
  210.         }  
  211.   
  212.         // 关闭数据库  
  213.         public void closeSMSDatabase() {  
  214.             if (db != null && db.isOpen()) {  
  215.                 db.close();  
  216.                 db = null;  
  217.             }  
  218.         }  
  219.   
  220.     }  
  221. }  
运行结果:


代码示例

Android Contacts(一)—— 读取联系人

分类: Android   3524人阅读  评论(0)  收藏  举报
android listview string sqlite list null

Introduction To Android Contacts

Learn to work with the Android contacts database. Basic knowledge of accessing SQLite in Android along with using Cursors is expected. See the Android SQLite and Cursor Article for more information. Google changed the contacts database moving from 1.x to 2.0 versions of Android. This tutorial will be broken into 3 sections. First covering accessing contacts in Android 2.0. The second page will deal with accessing the contacts in Android 1.6 and before. Third we'll glue it all together with a class that abstracts specific classes for each version and a set of classes to manage the data from the contact records.


Contacts 读取代码:

[java]  view plain copy print ?
  1. package com.homer.phone;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. import android.app.Activity;  
  7. import android.database.Cursor;  
  8. import android.os.Bundle;  
  9. import android.provider.ContactsContract;  
  10. import android.provider.ContactsContract.CommonDataKinds.Phone;  
  11. import android.widget.ListView;  
  12. import android.widget.SimpleAdapter;  
  13.   
  14. public class phoneRead extends Activity {  
  15.         
  16.     @Override  
  17.     public void onCreate(Bundle savedInstanceState){  
  18.         super.onCreate(savedInstanceState);  
  19.           
  20.         showListView();  
  21.     }  
  22.       
  23.     private void showListView(){  
  24.         ListView listView = new ListView(this);  
  25.           
  26.         ArrayList<HashMap<String, String>> list = getPeopleInPhone2();  
  27.         SimpleAdapter adapter = new SimpleAdapter(  
  28.                                     this,   
  29.                                     list,   
  30.                                     android.R.layout.simple_list_item_2,   
  31.                                     new String[] {"peopleName""phoneNum"},   
  32.                                     new int[]{android.R.id.text1, android.R.id.text2}  
  33.                                 );  
  34.         listView.setAdapter(adapter);  
  35.           
  36.         setContentView(listView);  
  37.     }  
  38.       
  39.     private ArrayList<HashMap<String, String>> getPeopleInPhone2(){  
  40.         ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();  
  41.           
  42.         Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, nullnullnullnull);     // 获取手机联系人  
  43.         while (cursor.moveToNext()) {  
  44.             HashMap<String, String> map = new HashMap<String, String>();  
  45.               
  46.             int indexPeopleName = cursor.getColumnIndex(Phone.DISPLAY_NAME);    // people name  
  47.             int indexPhoneNum = cursor.getColumnIndex(Phone.NUMBER);            // phone number  
  48.   
  49.             String strPeopleName = cursor.getString(indexPeopleName);  
  50.             String strPhoneNum = cursor.getString(indexPhoneNum);  
  51.   
  52.             map.put("peopleName", strPeopleName);  
  53.             map.put("phoneNum", strPhoneNum);  
  54.             list.add(map);  
  55.         }  
  56.         if(!cursor.isClosed()){  
  57.             cursor.close();  
  58.             cursor = null;  
  59.         }  
  60.           
  61.         return list;  
  62.     }  
  63. }  

AndroidManifest.xml 权限

 记得在AndroidManifest.xml中加入android.permission.READ_CONTACTS这个permission

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


运行结果:



代码示例

Android Contacts(二)—— SMS 短信 与 Contacts 联系人关联

分类: Android   4040人阅读  评论(3)  收藏  举报
sms android string null date 手机

Android 的SMS读取短信,可以获取发信人/收信人的手机号码(address),Contacts的联系人,可以过滤手机号码(address),因此SMS可以通过手机号码(address)关联到Contacts联系人


SMS - Contacts 关联代码

[java]  view plain copy print ?
  1. // 通过address手机号关联Contacts联系人的显示名字  
  2.     private String getPeopleNameFromPerson(String address){  
  3.         if(address == null || address == ""){  
  4.             return "( no address )\n";  
  5.         }  
  6.           
  7.         String strPerson = "null";  
  8.         String[] projection = new String[] {Phone.DISPLAY_NAME, Phone.NUMBER};  
  9.           
  10.         Uri uri_Person = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, address);  // address 手机号过滤  
  11.         Cursor cursor = getContentResolver().query(uri_Person, projection, nullnullnull);  
  12.           
  13.         if(cursor.moveToFirst()){  
  14.             int index_PeopleName = cursor.getColumnIndex(Phone.DISPLAY_NAME);  
  15.             String strPeopleName = cursor.getString(index_PeopleName);  
  16.             strPerson = strPeopleName;  
  17.         }  
  18.         cursor.close();  
  19.           
  20.         return strPerson;  
  21.     }  


SMS - Contacts 关联示例代码:

[java]  view plain copy print ?
  1. package com.homer.phone;  
  2.   
  3. import java.sql.Date;  
  4. import java.text.SimpleDateFormat;  
  5.   
  6. import android.app.Activity;  
  7. import android.database.Cursor;  
  8. import android.database.sqlite.SQLiteException;  
  9. import android.net.Uri;  
  10. import android.os.Bundle;  
  11. import android.provider.ContactsContract;  
  12. import android.provider.ContactsContract.CommonDataKinds.Phone;  
  13. import android.util.Log;  
  14. import android.widget.ScrollView;  
  15. import android.widget.TextView;  
  16.   
  17. public class phoneRead2 extends Activity {  
  18.   
  19.     @Override  
  20.     public void onCreate(Bundle savedInstanceState) {  
  21.         super.onCreate(savedInstanceState);  
  22.   
  23.         TextView tv = new TextView(this);  
  24.         tv.setText(getSmsInPhone());  
  25.   
  26.         ScrollView sv = new ScrollView(this);  
  27.         sv.addView(tv);  
  28.           
  29.         setContentView(sv);  
  30.     }  
  31.   
  32.     public String getSmsInPhone() {  
  33.         final String SMS_URI_ALL = "content://sms/";  
  34.         final String SMS_URI_INBOX = "content://sms/inbox";  
  35.         final String SMS_URI_SEND = "content://sms/sent";  
  36.         final String SMS_URI_DRAFT = "content://sms/draft";  
  37.         final String SMS_URI_OUTBOX = "content://sms/outbox";  
  38.         final String SMS_URI_FAILED = "content://sms/failed";  
  39.         final String SMS_URI_QUEUED = "content://sms/queued";  
  40.   
  41.         StringBuilder smsBuilder = new StringBuilder();  
  42.   
  43.         try {  
  44.             Uri uri = Uri.parse(SMS_URI_ALL);  
  45.             String[] projection = new String[] { "_id""address""person""body""date""type" };  
  46.             Cursor cur = getContentResolver().query(uri, projection, nullnull"date desc");      // 获取手机内部短信  
  47.   
  48.             if (cur.moveToFirst()) {  
  49.                 int index_Address = cur.getColumnIndex("address");  
  50.                 int index_Person = cur.getColumnIndex("person");  
  51.                 int index_Body = cur.getColumnIndex("body");  
  52.                 int index_Date = cur.getColumnIndex("date");  
  53.                 int index_Type = cur.getColumnIndex("type");  
  54.   
  55.                 do {  
  56.                     String strAddress = cur.getString(index_Address);  
  57.                     int intPerson = cur.getInt(index_Person);  
  58.                     String strbody = cur.getString(index_Body);  
  59.                     long longDate = cur.getLong(index_Date);  
  60.                     int intType = cur.getInt(index_Type);  
  61.   
  62.                     SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");  
  63.                     Date d = new Date(longDate);  
  64.                     String strDate = dateFormat.format(d);  
  65.   
  66.                     String strType = "";  
  67.                     if (intType == 1) {  
  68.                         strType = "接收";  
  69.                     } else if (intType == 2) {  
  70.                         strType = "发送";  
  71.                     } else {  
  72.                         strType = "null";  
  73.                     }  
  74.   
  75.                     String strAddress2 = getPeopleNameFromPerson(strAddress);  
  76.                       
  77.                     smsBuilder.append("[ ");  
  78. //                  smsBuilder.append(strAddress + ", ");  
  79.                     smsBuilder.append(strAddress + " : " + strAddress2 + ", ");  
  80.                     smsBuilder.append(intPerson + ", ");  
  81.                     smsBuilder.append(strbody + ", ");  
  82.                     smsBuilder.append(strDate + ", ");  
  83.                     smsBuilder.append(strType);  
  84.                     smsBuilder.append(" ]\n\n");  
  85.                 } while (cur.moveToNext());  
  86.   
  87.                 if (!cur.isClosed()) {  
  88.                     cur.close();  
  89.                     cur = null;  
  90.                 }  
  91.             } else {  
  92.                 smsBuilder.append("no result!");  
  93.             } // end if  
  94.   
  95.             smsBuilder.append("getSmsInPhone has executed!");  
  96.   
  97.         } catch (SQLiteException ex) {  
  98.             Log.d("SQLiteException in getSmsInPhone", ex.getMessage());  
  99.         }  
  100.   
  101.         return smsBuilder.toString();  
  102.     }  
  103.       
  104.     // 通过address手机号关联Contacts联系人的显示名字  
  105.     private String getPeopleNameFromPerson(String address){  
  106.         if(address == null || address == ""){  
  107.             return "( no address )\n";  
  108.         }  
  109.           
  110.         String strPerson = "null";  
  111.         String[] projection = new String[] {Phone.DISPLAY_NAME, Phone.NUMBER};  
  112.           
  113.         Uri uri_Person = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, address);  // address 手机号过滤  
  114.         Cursor cursor = getContentResolver().query(uri_Person, projection, nullnullnull);  
  115.           
  116.         if(cursor.moveToFirst()){  
  117.             int index_PeopleName = cursor.getColumnIndex(Phone.DISPLAY_NAME);  
  118.             String strPeopleName = cursor.getString(index_PeopleName);  
  119.             strPerson = strPeopleName;  
  120.         }  
  121.         cursor.close();  
  122.           
  123.         return strPerson;  
  124.     }  
  125.       
  126. }  

AndroidManifest.xml 权限

 记得在AndroidManifest.xml中加入android.permission.READ_SMSandroid.permission.READ_CONTACTS这两个permission

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


运行结果:



示例代码



参考推荐:

Android 之 Contacts 联系人读取



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

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

相关文章

Android 实现手机号短信验证码

使用mob第三方平台提供的免费短信验证码服务SMSSDK。 在Mob官网中注册登录并创建应用&#xff0c;获取相应的App key和App Secret。 在线安装&#xff0c;免下载SDK&#xff08;官网介绍&#xff09; 在根目录下的build.gradle文件中添加内容 在app目录下的build.gradle文件…

Android手机中获取手机号码和运营商信息

代码如下&#xff1a; package com.pei.activity;import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView;/*** class name&#xff1a…

Android Contacts(二)—— SMS 短信 与 Contacts 联系人关联

Android 的SMS读取短信&#xff0c;可以获取发信人/收信人的手机号码&#xff08;address&#xff09;&#xff0c;Contacts的联系人&#xff0c;可以过滤手机号码&#xff08;address&#xff09;&#xff0c;因此SMS可以通过手机号码&#xff08;address&#xff09;关联到Co…

在 Linux 终端上使用 ChatGPT, 轻松提高生产力

随着NFT和元宇宙的流行逐渐消退&#xff0c;人工智能已成为技术领域的新热词。ChatGPT及其替代品在互联网上蓬勃发展&#xff0c;帮助用户轻松完成日常任务。很多文章都介绍了如何开始制作类似ChatGPT的聊天机器人以及如何在任何浏览器中使用Bing AI等指南。但是&#xff0c;如…

大家查找医疗英文文献都去哪个网?

文献阅读是每一个医学科研人都逃脱不了且贯穿整个科研生涯的需求&#xff0c;尤其是英文文献的检索与阅读&#xff0c;我们不得不承认医疗类国际前沿与热点的文章都普遍为英文文献。那么拥有一个使用起来得心应手的文献检索网站就是非常必要的&#xff0c;毕竟巧妇难为无米之炊…

哪些平台可以查看医学类文献?

世上文献检索千千万&#xff0c;医学文献检索选哪站&#xff1f;下面我就为大家总结了8个检索医学类期刊的文献检索网站&#xff01; 目录 1. 中国知网全文数据库(CNKI) 2. 掌桥科研 3. SinoMed中国生物医学文献数据库(CBM) 4. 中华医学期刊全文数据库 5. JAMA Netw…

如何着手写一篇医学综述?

各位医学研究生&#xff0c;研0的时候是不是导师都已经把综述布置下来作为你的第一份作业呀&#xff1f;对于医学生们来说&#xff0c;不管你是本科就已经开始接触科研还是研究生开始才接触科研&#xff0c;反正在你开始阅读文献的时候开始一篇综述总是逃不过的。鉴于有综述任务…

【学习】ChatGPT对问答社区产生了哪些影响?

引用 StackExchange 社区 CEO Prashanth Chandrasekar 的一篇博客标题 “Community is the future of AI”&#xff0c;引出本文的观点&#xff0c;即ChatGPT对问答社区产生了颠覆性影响&#xff0c;问答社区必须釜底抽薪、涅槃重生&#xff0c;但我们必须坚信“社区才是AI的未…

你想要的宏基因组-微生物组知识全在这(2023.5)

欢迎点击上方蓝色”宏基因组”关注我们&#xff01; 宏基因组/微生物组是当今世界科研最热门的研究领域之一&#xff0c;为加强宏基因组学技术和成果交流传播&#xff0c;推动全球华人微生物组领域发展&#xff0c;中科院青年科研人员创立“宏基因组”公众号&#xff0c;联合海…

2023年第二十届ChinaJoy新闻发布会 十大亮点解读

5月29日&#xff0c;2023年第二十届中国国际数码互动娱乐展览会&#xff08;ChinaJoy&#xff09;新闻发布会&#xff0c;在上海浦东嘉里大酒店召开&#xff0c;宣布本届ChinaJoy将于7月28日至7月31日&#xff0c;在上海新国际博览中心举办。 中国音像与数字出版协会第一副理事…

BFT 最前线 | 王小川:2033机器智慧将超人类;扎克伯格财富暴涨;哈工大:能跳跃的昆虫机器人;北京支持“1+4”机器人领域

原创 | 文 BFT机器人 名人动态 CELEBRITY NEWS 01 王小川&#xff1a;10年后机器智慧将超过人类 年底将推出对标GPT-3.5的模型 科技预言大师雷库兹韦尔说人工智能的奇点&#xff0c;机器智慧超过人类会发生在2045年&#xff0c;王小川的判断比这更激进&#xff0c;他认为这一…

开启单细胞及空间组学行业发展黄金时代!首届国际单细胞及空间组学大会在穗闭幕

2023年4月16日&#xff0c;首届TICSSO国际单细胞及空间组学大会圆满闭幕&#xff0c;本次大会吸引了2000余位来自产、学、研、资、医、政、媒等业界人士齐聚羊城&#xff0c;注册总人数5398人&#xff0c;网络播放总量达548245人次&#xff0c;网络观看覆盖美国、德国、日本、澳…

聚集十二罗汉,探索宇宙本质,马斯克神秘的xAI

作者 | 德新编辑 | 王博 马斯克组团入局通用人工智能。 7月12日&#xff0c;马斯克发推官宣成立新的公司xAI。据官网介绍&#xff0c;这是一家试图「探索理解宇宙本质」的公司。 新公司公布了12名首批成员&#xff0c;除了马斯克外&#xff0c;他们曾经在「AlphaStar、AlphaCod…

Transformer作者:指令型智能体的构建之法

来源 | The Robot Brains PodcastOneFlow编译翻译&#xff5c;徐佳渝、贾川、杨婷2017年&#xff0c;Google发布的《Attention Is All You Need》论文提出了Transformer架构&#xff0c;这成为过去十年神经网络领域最具影响力的技术创新之一&#xff0c;并被广泛应用于NLP、计算…

华为版AIGC或于7月7日发布;350名行业大佬警告AI可能给人类带来灭绝风险;钉钉斜杠“/” 面向企业用户定向邀测丨每日大事件...

‍ ‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 企业动态 欧盟官员将于6月会见OpenAI CEO&#xff1a;讨论人工智能法规 5月30日&#xff0c;欧盟官员表示&#xff0c;欧盟产业主管埃里布雷顿将于下月在旧金山与美国人工智能研究公司OpenAI首席执行官山姆阿尔特曼会面&…

大湾区年度盛会上线!院士领衔,20+重磅嘉宾,相信边缘的力量!

边缘计算&#xff0c;作为一种革命性的计算范式&#xff0c;已经引起了全球各行各业的广泛关注。在云计算、大数据、人工智能等技术的驱动下&#xff0c;边缘计算能够将计算能力下沉到数据源头&#xff0c;实现更快的响应、更高的效率、更低的成本和更强的隐私保护。据市场研究…

ACL 2023|大模型时代,自然语言领域还有什么学术增长点?

省时查报告-专业、及时、全面的行研报告库 省时查方案-专业、及时、全面的营销策划方案库 【免费下载】2023年5月份全网热门报告合集 普通人如何利用ChatGPT变现赚钱&#xff1f; 无需翻墙&#xff0c;无需注册&#xff0c;ChatGPT4直接使用 ChatGPT提词手册&#xff0c;学完工…

为AIGC敲响警钟!千亿级赛道为何成了作恶温床?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 随着人工智能通用大模型的问世&#xff0c;全球对AIGC技术的强大潜力有了更加深刻的认识。然而&#xff0c;这也引发了诸多关于AIGC技术可信度、隐私保护以及知识产权等问题的争议&#xff0c;引起了广泛关注。 5月9日&…

Milvus应用开发实战【语义搜索】

美国总统竞选活动即将到来。 现在是回顾拜登政府上任头两年的一些演讲的好时机。 搜索一些演讲记录以了解更多关于白宫迄今为止关于某些主题的信息不是很好吗&#xff1f; 假设我们要搜索演讲的内容。 我们该怎么做&#xff1f; 我们可以使用语义搜索。 语义搜索是目前人工智能…

YC最新投资值得细琢磨!亲测爽飞的ChatGPT联网工具;阿里云大模型开启邀测;SD绘画新手入门手册 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『ChatGPT 恢复 Plus 订阅服务』实测&#xff0c;昨天确实巨卡 实测发现&#xff0c;OpenAI ChatGPT 已经恢复了 Plus 订阅服务&…