A:ContentProvider
1, Introduction to ContentProvider:
1.ContentProvider content provider (one of the four components) is mainly used to realize the function of data sharing between different applications.
2. Skill points:
(1) Access the content provider of the system (***********)
Mobile phone contact / audio / video / gallery / SMS/
(2) Write your own content provider
3. Note:
2, Schematic diagram
3, Get the music in the phone and display it in ListView
1. Read / write SD card permission
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2. Code implementation
(1) Entity class
(2) Tool class acquisition
public class SongsUtils { //Returns the full name of the local song public static List<SongBean> getSongs(Context context){ ArrayList<SongBean> songBeans = new ArrayList<>(); ContentResolver contentResolver = context.getContentResolver(); Cursor cursor = contentResolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null); if(cursor != null ){ while (cursor.moveToNext()){ String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.TITLE)); String singer = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ARTIST)); String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); String album_id = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); //Get album cover according to album id Cursor query = contentResolver.query(Uri.parse("content://media/external/audio/albums/" + album_id), null, null, null, null); if(query != null){ while (query.moveToNext()){ String album = query.getString(query.getColumnIndex("album_art")); songBeans.add(new SongBean(name,singer,data,album)); } query.close();//Close cursor } } cursor.close();//Close cursor } return songBeans; } }
4, Get mobile phone contacts and display them in ListView
1. Add permission to obtain mobile phone contact
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
2. Add permission to obtain mobile phone contact
//Get mobile contacts public void click1(View view) { //TODO 1: get ContentResolver ContentResolver resolver = getContentResolver(); //TODO 2: determine the uri and the field to query Uri uri= ContactsContract.CommonDataKinds.Phone.CONTENT_URI; String[] strs={ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER}; //TODO 3: execute the query and display the result traversal in the ListView and store it in the local database Cursor cursor=resolver.query(uri,strs,null,null,null); ArrayList<Phone> list=new ArrayList<>(); while(cursor.moveToNext()){ String name=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); String number=cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); list.add(new Phone(name,number)); //Store each record in its own database } //Display the data in the list collection in the ListView, which is omitted here } class Phone{ private String name; private String number; public Phone(String name, String number) { this.name = name; this.number = number; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } }
5, Get SMS
(1) Add permission to get SMS
<uses-permission android:name="android.permission.READ_SMS" />
(2) Get the SMS content, display it in the ListView, and store the information in the database
uri: Telephony.Sms.CONTENT_URI
Field: telephone.sms.address address content of telephone.sms.body
//Get SMS @RequiresApi(api = Build.VERSION_CODES.KITKAT) public void click2(View view) { 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); //The first type is ListView, and the second type is save to database 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)); list.add(new Msm(address,body)); //Execute insert statement } } class Msm{ private String address; private String body; public Msm(String address, String body) { this.address = address; this.body = body; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getBody() { return body; } public void setBody(String body) { this.body = body; } }
4, Get all the pictures / videos of your phone
5, Get phone call records
. . . .
B: Custom content provider
1, What is a custom content provider
When it comes to content providers, you should think of providers and requestors. Before, we obtained mobile phone contacts. The provider is the system APP itself and the requester is us; Now, if we want to be a provider and let others access our database, we need to customize the content provider.
2, Idea:
1. Provider: ContentProvider
(1) Create a database, and the custom class inherits SQLiteOpenHelper
(2) Customize the content provider class, inherit the ContentProvider, override the insert/delete/update/query method, and provide methods to the outside world
(3) Registering content providers in manifest files
2. Requester: ContentResolver
(1) Obtain the ContentResolver object through the getContentResolver method of Context
(2) Determine uri
(3) Call the insert/delete/update/query method to access the database
3, Provider code: creating my_contentprovider moudle
(1) Custom classes inherit SQLiteOpenHelper
public class MyHelper extends SQLiteOpenHelper { public MyHelper(Context context) { super(context, "user.db", null, 1); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("create table user (_id integer primary key autoincrement ,name varchar(30),age integer)"); for(int i=1;i<10;i++){ db.execSQL("insert into user values(null,?,?)",new String[]{"Total finalization"+i+"",i+""}); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
(2) Custom content provider class, inheriting ContentProvider
public class MyProvider extends ContentProvider { private MyHelper myHelper; private SQLiteDatabase db; //Get database @Override public boolean onCreate() { myHelper=new MyHelper(getContext()); db=myHelper.getWritableDatabase(); if(db==null){ return false; }else{ return true; } } @Nullable @Override public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection, @Nullable String[] selectionArgs, @Nullable String sortOrder) { return db.query("user",projection,selection,selectionArgs,null,null,sortOrder); } @Nullable @Override public String getType(@NonNull Uri uri) { return null; } @Nullable @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { db.insert("user",null,values); return uri; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { return db.delete("user",selection,selectionArgs); } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { return db.update("user",values,selection,selectionArgs); } }
(3) Registering content providers in manifest files
<!--Registered content provider exported Can it be accessed by other applications authorities: uri name: Full path of class--> <provider android:exported="true" android:authorities="com.bawei" android:name=".MyProvider"></provider>
Note: the authorities attribute in the manifest file is the uri of the requestor: com.bawei
4, Content requestor code
(1) Get ContentResolver directly
Determine Uri: conten://com.bawei You must add content://
public class MainActivity extends AppCompatActivity { private ContentResolver contentResolver; private Uri uri; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); uri=Uri.parse("content://com.bawei"); contentResolver=getContentResolver(); } //user (_id integer primary key autoincrement ,name varchar(30),age integer) public void query(){ //Parameter 1: uri parameter 2: query field parameter 3: condition parameter 4: Yes? Assignment parameter 5: sorting Cursor cursor=contentResolver.query(uri,new String[]{"_id","name"},null,null,null); //ergodic } public void delete(){ //Parameter 1: uri parameter 2: condition parameter 3: Yes? assignment int raw=contentResolver.delete(uri,"name=?",new String[]{"Sweet snow"}); } public void insert(){ //Add data ContentValues contentValues=new ContentValues(); contentValues.put("name","Sweet snow"); contentValues.put("age",18); contentResolver.insert(uri,contentValues); //ergodic } }
C. Use the content provider to dynamically obtain the verification code
D. Custom permissions
1. Usage scenario?
Defining permissions is generally used for exposed components to improve security. Android allows one application (client) to call the components of another application (server). Then, as a server application, the corresponding components must be exposed before the client application can access them. Of course, permission is not necessary when exposing. If the exposed component does not have permission, any other application can call the component; If the component has applied for permission, only the application with the permission can call the component.
2. How?
(1) Content provider's manifest document
User defined permissions + permissions used when content providers register
<!--1.Custom permissions--> <permission android:name="com.bawei.permission.READ" android:protectionLevel="normal" > </permission> <permission android:name="com.bawei.permission.WRITE" android:protectionLevel="normal" > </permission> <!--2.Set custom permissions when registering content--> <provider android:readPermission="com.bawei.permission.READ" android:writePermission="com.bawei.permission.WRITE" android:name=".MyProvider" android:authorities="com.bawei.1704.myprovider" android:exported="true"></provider>
Explain the following attributes:
- Name, which is the name of the permission.
- description, which is the introduction of permissions.
- permissionGroup, which specifies the group of the permission.
- protectionLevel, which specifies the protection level. normal is generally used
Android divides permissions into several protection levels, such as normal, dangerous, signature, etc. Normal is the normal permission, which does not pose a risk to the privacy of users or devices; Dangerous permission is dangerous permission, which usually brings risks to the privacy of users' data or devices; Signature means that only applications with the same signature can use this permission.
(2) Add permission to content resolver manifest file
<uses-permission android:name="com.bawei.permission.WRITE"></uses-permission> <uses-permission android:name="com.bawei.permission.READ"></uses-permission>