1.权限机制


添加权限后

  • 用户在安装时知道程序需要哪些权限。
  • 用户在程序管理界面查看程序申请了哪些权限。 内容提供器 - 图1

    2.运行时权限


  1. public class MainActivity extends AppCompatActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. Button makeCall = findViewById(R.id.make_call);
  7. makeCall.setOnClickListener(new View.OnClickListener() {
  8. @Override
  9. public void onClick(View v) {
  10. if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
  11. ActivityCompat.requestPermissions(MainActivity.this, new String[]{
  12. Manifest.permission.CALL_PHONE
  13. }, 1);
  14. } else {
  15. call();
  16. }
  17. }
  18. });
  19. }
  20. private void call() {
  21. try {
  22. Intent intent = new Intent(Intent.ACTION_CALL);
  23. intent.setData(Uri.parse("tel:10086"));
  24. startActivity(intent);
  25. } catch (SecurityException e) {
  26. e.printStackTrace();
  27. }
  28. }
  29. @Override
  30. public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
  31. switch (requestCode) {
  32. case 1:
  33. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  34. call();
  35. } else {
  36. Toast.makeText(MainActivity.this, "You denied the permission", Toast.LENGTH_SHORT).show();
  37. }
  38. break;
  39. default:
  40. break;
  41. }
  42. }
  43. }

3. 访问其他程序中的数据


内容提供器分为系统内置和 自定义实现的内容提供器。应用程序通过内容提供器对其数据提供了外部访问接口。Android系统中自带的电话簿,短信,媒体库等程序都提供了类似的访问接口。

ContentResolver**

应用程序通过ContentResolver类来访问其他应用程序共享的数据,可以通过Context中的getContentResolver()方法获取到该类的实例。

  1. package com.example.contactstest;
  2. import androidx.appcompat.app.AppCompatActivity;
  3. import androidx.core.app.ActivityCompat;
  4. import androidx.core.content.ContextCompat;
  5. import android.Manifest;
  6. import android.content.pm.PackageManager;
  7. import android.database.Cursor;
  8. import android.os.Bundle;
  9. import android.provider.ContactsContract;
  10. import android.widget.ArrayAdapter;
  11. import android.widget.ListView;
  12. import android.widget.Toast;
  13. import java.util.ArrayList;
  14. import java.util.Currency;
  15. import java.util.List;
  16. public class MainActivity extends AppCompatActivity {
  17. ArrayAdapter<String> adapter;
  18. List<String> contactList = new ArrayList<>();
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState) {
  21. super.onCreate(savedInstanceState);
  22. setContentView(R.layout.activity_main);
  23. ListView contactView = (ListView) findViewById(R.id.contacts_view);
  24. adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contactList);
  25. contactView.setAdapter(adapter);
  26. if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
  27. ActivityCompat.requestPermissions(this, new String[]{
  28. Manifest.permission.READ_CONTACTS
  29. }, 1);
  30. } else {
  31. readContacts();
  32. }
  33. }
  34. private void readContacts() {
  35. Cursor cursor = null;
  36. try {
  37. cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
  38. if (cursor != null) {
  39. while (cursor.moveToNext()) {
  40. String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
  41. String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  42. contactList.add(displayName + "\n" + number);
  43. }
  44. adapter.notifyDataSetChanged();
  45. }
  46. } catch (Exception e) {
  47. e.printStackTrace();
  48. } finally {
  49. if (cursor != null) {
  50. cursor.close();
  51. }
  52. }
  53. }
  54. @Override
  55. public void onRequestPermissionsResult(int requestCode, String[] permissions, int [] grantResults) {
  56. switch (requestCode) {
  57. case 1:
  58. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
  59. readContacts();
  60. } else {
  61. Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
  62. }
  63. break;
  64. default:
  65. break;
  66. }
  67. }
  68. }

4.创建自己的内容提供器


TODO