1.布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="readSMS"
android:text="查看短信">
</Button>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>
2.MainActivity.java:
public class MainActivity extends Activity {
private ListView mListView;
private SimpleAdapter sa;
private List<Map<String, Object>> data;
public static final int REQ_CODE_CONTACT = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
initView();
}
private void initView() {
mListView = findViewById( R.id.listView );
data = new ArrayList<Map<String, Object>>();
//配置适配置器Sa
sa = new SimpleAdapter( this, data, android.R.layout.simple_list_item_2,
new String[]{"names", "message"}, new int[]{android.R.id.text1,
android.R.id.text2} );
mListView.setAdapter( sa );
}
/**
* 点击读取短信
* @param view
*/
public void readSMS(View view) {
checkSMSPermission();
}
/**
* 检查申请短信权限
*/
private void checkSMSPermission() {
if (ContextCompat.checkSelfPermission( this, Manifest.permission.READ_SMS )
!= PackageManager.PERMISSION_GRANTED) {
//未获取到读取短信权限,向系统申请权限
ActivityCompat.requestPermissions( this,
new String[]{Manifest.permission.READ_SMS}, REQ_CODE_CONTACT );
} else {
query();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
//判断用户是否,同意获取短信授权
if (requestCode == REQ_CODE_CONTACT && grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//获取到读取短信权限
query();
} else {
Toast.makeText( this, "未获取到短信权限", Toast.LENGTH_SHORT ).show();
}
}
private void query() {
//读取所有短信
Uri uri = Uri.parse( "content://sms/" ); //通过content://sms/这个URI访问SMS数据库
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query( uri, new String[]{"_id", "address", "body", "date", "type"}, null, null, null );
if (cursor != null && cursor.getCount() > 0) {
int _id;
String address;
String body;
String date;
int type;
while (cursor.moveToNext()) {
Map<String, Object> map = new HashMap<String, Object>();
_id = cursor.getInt( 0 );
address = cursor.getString( 1 );
body = cursor.getString( 2 );
date = cursor.getString( 3 );
type = cursor.getInt( 4 );
map.put( "names", body );
Log.i( "test", "_id=" + _id + " address=" + address + " body=" + body + " date=" + date + " type=" + type );
data.add( map );
//通知适配器发生改变
sa.notifyDataSetChanged();
}
}
}
}
3.在清单文件中添加读取短信的权限:
<uses-permission android:name="android.permission.READ_SMS"/>
4.总结:
1.Android存放短信的数据库为mmssms.db在/data/data/com.android.providers.telephony目录下,该目录需要手机root之后才能看。
其中sms表—存放了手机的所有短信,其中的字段如下:
- _id:短信序号
- thread_id:对话的序号
- address:发件人地址,手机号
- person:发件人,返回一个数字就是联系人列表里的序号,陌生人为null
- date:日期,long类型
- protocol:协议 0 SMS_RPOTO,1 MMS_PROTO
- read:是否阅读 0 未读,1 已读
- status:状态 -1 接收,0 complete,64 pending,128 failed
- type:类型 1 接收到的,2 已发出
- body:短信消息内容
- service_center:短信服务中心号码编号
2.Android内容提供者:
内容提供者是应用程序之间共享数据的接口。应用程序创建的数据库,默认情况下是私有的,别的应用程序访问不到数据,如果想要把数据对外提供,就要使用内容提供者。