ContentProvider 系统URI&BroadCastReceiver
案例一:获取手机联系人,展示并储存
public class MainActivity extends AppCompatActivity {
private Button buttonId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonId = findViewById(R.id.button_id);
buttonId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//根据版本动态获取授权(6.0以上)
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS,Manifest.permission.READ_CONTACTS},100);
}else{
resolverMethod();
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100 & grantResults[0] == PackageManager.PERMISSION_GRANTED){
resolverMethod();
}
}
//因为重复使用,所有封装
private void resolverMethod() {
ContentResolver contentResolver = getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] strings = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME};
Cursor cursor = contentResolver.query(uri, strings, null, null, null);
while (cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
//有了对象,其他都好说了.
Phone phone = new Phone(name, number);
}
}
}
案例二:获取手机短信
private void smsMethod() {
ContentResolver resolver = getContentResolver();
Uri uri= Telephony.Sms.CONTENT_URI;
String[] strs={Telephony.Sms.BODY,Telephony.Sms.ADDRESS};
Cursor cursor=resolver.query(uri,strs,null,null,null);
//第一种ListView 中 第二种 :存到数据库
ArrayList<Msm> list=new ArrayList<>();
while(cursor.moveToNext()){
String address=cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
String body=cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
Toast.makeText(this, body, Toast.LENGTH_SHORT).show();
list.add(new Msm(address,body));
//执行insert语句
}
}
案例三:自动填写注册手机验证码
观察者代码
public class SmsObserver extends ContentObserver {
private static final String TAG = "SmsObserver";
private ContentResolver contentResolver;
private Handler handler;
public SmsObserver(Handler handler ,Context context) {
super(handler);
this.handler = handler;
contentResolver = context.getContentResolver();
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
String[] strs={Telephony.Sms.BODY,Telephony.Sms.ADDRESS};
Cursor cursor = contentResolver.query(Telephony.Sms.CONTENT_URI, strs, null, null, null);
if (cursor != null){
cursor.moveToFirst();
String string = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
Log.i(TAG, "onChange: 0000"+string);
Message obtain = Message.obtain();
obtain.obj = string;
handler.sendMessage(obtain);
}else{
Log.i(TAG, "onChange: kong");
}
}
}
MainActicity
public class SmsActivity extends AppCompatActivity {
private EditText smsId;
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
String s = (String)msg.obj;
Toast.makeText(SmsActivity.this, s, Toast.LENGTH_SHORT).show();
smsId.setText(s);
}
};
private SmsObserver smsObserver;
private ContentResolver contentResolver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms);
smsId = findViewById(R.id.sms_id);
smsObserver = new SmsObserver(handler,this);
contentResolver = getContentResolver();
//注册观察者
contentResolver.registerContentObserver(Telephony.Sms.CONTENT_URI,true,smsObserver);
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销观察者
contentResolver.unregisterContentObserver(smsObserver);
}
}
案例四:获取手机所有的图片
1,添加权限.
<!--读写sd卡的权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2,添加一个监听事件
musicId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},103);
}else{
musicMethod();
}
}
});
3,添加java代码
private void musicMethod() {
//TODO 1:获得ContentResolver
ContentResolver contentResolver = getContentResolver();
//参数一 URI
//TODO 2:获得音乐的URI
Uri uri1 = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;//音乐的URI
Cursor cursor = contentResolver.query(uri1, null, null, null, null);
while (cursor.moveToNext()){
//字段
String title=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE));
//地址
String data=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA));
//歌手
String artist=cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST));
//时长
long duration=cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.DURATION));
long size=cursor.getLong(cursor.getColumnIndex(MediaStore.Audio.Media.SIZE));
Log.i("###", "音乐: "+title+":"+data+":"+artist+":"+duration+":"+size);
}
}
4,回调函数中,添加逻辑
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == 100 & grantResults[0] == PackageManager.PERMISSION_GRANTED){
resolverMethod();
}else if (requestCode == 101 & grantResults[0] == PackageManager.PERMISSION_GRANTED){
smsMethod();
}else if (requestCode == 102 & grantResults[0] == PackageManager.PERMISSION_GRANTED){
picMethod();
}else if (requestCode == 103 & grantResults[0] == PackageManager.PERMISSION_GRANTED){
musicMethod();
}
}
案例五:获取手机所有的视频
1,添加权限.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2,添加一个监听事件
videoId.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE},104);
}else{
videoMethod();
}
}
});
3,添加java代码
private void videoMethod() {
//TODO 1:获得ContentResolver
ContentResolver contentResolver = getContentResolver();
//参数一 URI
//TODO 2:获得视频的URI
Uri uri1 = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;//视频的URI
// Uri uri1 = Uri.parse("content://media/external/video/media");
Cursor cursor = contentResolver.query(uri1, null, null, null, null);
while (cursor.moveToNext()){
//字段
String title=cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.TITLE));
String data=cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA));
String artist=cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.ARTIST));
long duration=cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.DURATION));
long size=cursor.getLong(cursor.getColumnIndex(MediaStore.Video.Media.SIZE));
Log.i("###", "视频: "+title+":"+data+":"+artist+":"+duration+":"+size);
}
}
4,回调函数中,添加逻辑
else if (requestCode == 104 & grantResults[0] == PackageManager.PERMISSION_GRANTED){
videoMethod();
}
案例六:手机联系人的增删改(拓展)
private void addPerson() {
ContentResolver contentResolver = getContentResolver();
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
//ContactsContract.RawContacts.CONTENT_URI
ContentValues values = new ContentValues();
//插入一条空数据,返回当前空数据的id.
long contactid = ContentUris.parseId(contentResolver.insert(uri, values));
uri = Uri.parse("content://com.android.contacts/data");
//添加姓名
values.put("raw_contact_id", contactid);
values.put("mimetype", "vnd.android.cursor.item/name");
values.put("data1", "xiaoming11");
contentResolver.insert(uri, values);
values.clear();
//添加电话
values.put(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID, contactid);
//ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE;
values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");
//ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;
values.put(ContactsContract.Data.DATA1, "12312312311");
contentResolver.insert(uri, values);
values.clear();
//添加Email
values.put("raw_contact_id", contactid);
//ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE;
values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/email_v2");
values.put("data1", "11111111@qq.com");
contentResolver.insert(uri, values);
}
BroadCastReceiver
什么是BroadcastReceiver ?
BroadcastReceiver是广播接收者安卓四大组件之一,应用于同一APP下多个组件之间传递数据(Activity/Fragment/Service之间传递数据)
(2)2个APP之间传递数据
BroadcastReceiver三要素
广播三要素:
(1)广播发送者 : 发送广播
(2)广播接收者(调频): 用于接收广播
(3)要处理的事情 :处理广播的相关信息, Intent有图对象
广播的生命周期&注册方式
静态注册和动态注册的区别:假如说Activity是接受者:
动态注册:
(1)广播会跟Activity的生命周期的结束而结束;
(2)自由的控制注册和取消,有很大的灵活性
静态注册:
(1)广播不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接受广播
(2)全局的广播
广播的类型
无序广播(标准广播)
Intent intent = new Intent();
intent.setAction("com.feng.broad");
Bundle bundle = new Bundle();
bundle.putString("msg","大风起兮云飞扬,高薪就业创辉煌");
intent.putExtras(bundle);
sendBroadcast(intent);
有序广播
Intent intent1 = new Intent();
intent1.setAction("com.feng.broad");
//第一个参数是intent 二是权限名.
sendOrderedBroadcast(intent1,null);
使用步骤
1.写一个MyReceiver类继承BroadcastReceiver
2.清单文件中注册并设置过滤器
3.广播者发送广播
4.广播接收者判断Action 接收数据
演示案例代码
清单文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.day12">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<receiver
android:name=".MyReceiver2"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1000">
<action android:name="com.feng.broad"></action>
</intent-filter>
</receiver>
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="900">
<action android:name="com.feng.broad" />
</intent-filter>
</receiver>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button sendId;
private MyReceiver myReceiver;
private Button sendOrderId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sendOrderId = findViewById(R.id.send_order_id);
sendOrderId.setOnClickListener(this);
sendId = findViewById(R.id.send_id);
sendId.setOnClickListener(this);
//1,创建一个广播
// myReceiver = new MyReceiver();
// //添加广播过滤器
// IntentFilter intentFilter = new IntentFilter();
// //添加action
// intentFilter.addAction(BroadcastConst.ACTION);
// //注册
// registerReceiver(myReceiver,intentFilter);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.send_id:
Intent intent = new Intent();
intent.setAction("com.feng.broad");
Bundle bundle = new Bundle();
bundle.putInt("msg",123);
intent.putExtras(bundle);
sendBroadcast(intent);
break;
case R.id.send_order_id:
Intent intent1 = new Intent();
intent1.setAction("com.feng.broad");
sendOrderedBroadcast(intent1,null);
break;
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
//注销广播
unregisterReceiver(myReceiver);
}
}
广播接收者
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
@Override
public void onReceive(Context context, Intent intent) {
//TODO 1:获取action
String action = intent.getAction();
if(BroadcastConst.ACTION.equals(action)){
// Bundle extras = intent.getExtras();
// int msg = extras.getInt("msg");
Log.i(TAG, "onReceive: ");
}
}
}