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", "[email protected]");
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: ");
}
}
}