標籤:情境 builder stringbu pack 檔案 set 封裝 manifest 格式
ContentProvider雖然與Activity、Service、BroadcastReceiver齊名為Android四大組件。如果你不是特別開發一款與其他APP有資料互動的應用,它的使用頻率遠沒有另外三者高。因為已經介紹了前三大組件,為了完善Android四大組件介紹瞭解,這次補充下ContentProvider介紹。哈哈~一邊在看世界盃,巴西打瑞士。目前巴西1:0。我把所有金幣全壓巴西了~題外話說完,下面簡單介紹下ContentProvider。
一. ContentProvider簡介和常見使用情境:
Android的資料存放區方式總共有五種,分別是:Shared Preferences、網路儲存、檔案儲存體、外儲儲存、SQLite。但是我們知道一般這些儲存都只是在單獨的一個應用程式之中達到一個資料的共用,有時候我們需要操作其他應用程式的一些資料,例如我們需要作業系統裡的媒體庫、通訊錄等,這時我們就可能通過ContentProvider來滿足我們的需求了。
由此我們知道,ContentProvider為儲存和擷取資料提供了統一的介面。ContentProvide對資料進行封裝,不用關心資料存放區的細節。使用表的形式來組織資料。使用ContentProvider可以在不同的應用程式之間共用資料。Android為常見的一些資料提供了預設的ContentProvider(包括音頻、視頻、圖片和通訊錄等)。總結就是: ContentProvider一般為儲存和擷取資料提供統一的介面,可以在不同的應用程式之間共用資料。
二.ContentProvider 常見的幾個類:1.ContentResolver
Android為我們提供了ContentResolver來統一管理與不同ContentProvider間的操作。
調用getContentResolver()
來獲得ContentResolver。
ContentResolver是如何來區別不同的ContentProvider的呢?這就涉及到URI(Uniform Resource Identifier)問題。
2.URI
ContentProvider中的URI有固定格式,如:
Authority:授權資訊,用以區別不同的ContentProvider;
Path:表名,用以區分ContentProvider中不同的資料表;
Id:Id號,用以區別表中的不同資料;
三.ContentProvider查詢手機通訊錄連絡人資訊樣本:
private TextView tv_query_contacts; private TextView tv_info_contacts; String[] premiss = new String[]{ Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_info_contacts = findViewById(R.id.tv_info_contacts); tv_query_contacts = findViewById(R.id.query_contacts); tv_query_contacts.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { checkPresmissed(); } }); } /** * 查詢手機通訊錄所有連絡人名稱 */ private void queryContacts() { Uri urlContacts = Uri.parse("content://com.android.contacts/contacts"); ContentResolver contentResolver = getContentResolver(); Cursor cursorsContacts = contentResolver.query(urlContacts, new String[]{ContactsContract.Data._ID}, null, null, null); StringBuilder stringBuilder = new StringBuilder(); while (cursorsContacts.moveToNext()) { Uri uriPhone = Uri.parse("content://com.android.contacts/contacts/" + cursorsContacts.getInt(0) + "/data"); Cursor cursorPhone = contentResolver.query(uriPhone, new String[]{ContactsContract.Data.DATA1, ContactsContract.Data.MIMETYPE}, null, null, null); while (cursorPhone.moveToNext()) { if(cursorPhone.getString(cursorPhone.getColumnIndex("mimetype")).equals("vnd.android.cursor.item/name")){ //姓名 stringBuilder.append(cursorPhone.getString(cursorPhone.getColumnIndex("data1"))); } } } tv_query_contacts.setText(""); tv_info_contacts.setText(stringBuilder.toString()); } private void checkPresmissed() { /** * 第 1 步: 檢查是否有相應的許可權 */ boolean isAllGranted = checkPermissionAllGranted( new String[]{ Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS } ); // 如果這3個許可權全都擁有, 則直接執行備份代碼 if (isAllGranted) { queryContacts(); } else { /** * 第 2 步: 請求許可權 */ // 一次請求多個許可權, 如果其他有許可權是已經授予的將會自動忽略掉 ActivityCompat.requestPermissions(this, premiss, 11); } } /** * 檢查是否擁有指定的所有許可權 */ private boolean checkPermissionAllGranted(String[] permissions) { for (String permission : permissions) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { // 只要有一個許可權沒有被授予, 則直接返回 false return false; } } return true; } //授權回調 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 11) { queryContacts(); } }
Android 四大組件 (四) ContentProvider介紹