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: ");
       }
   }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章