Android mini course 8 - content provider, content resolver, content resolver

Application B accesses the database of application A in two ways:
1. There is A Linux system under Android. Use the chmod command of the Linux system to change the file to accessible (modify permissions), and application B can directly access the database of application A.
2.ContentProvider: create an intermediate contact in application A, application B accesses the intermediate contact, and the intermediate contact accesses the database of application A (ContentProvider provides other applications with A data access interface of this application)

ContentProvider content provider (for database only)

The content provider encapsulates the data and then provides it. Other applications can access it through the content resolver.

ContentResolver content resolver

Content resolver. This class provides the methods of adding, deleting, modifying and querying with the same name and parameters in the ContentProvider (content provider), and uses the corresponding methods to operate the data provided by the ContentProvider through the URI.

Case: access the database of SMS in Android system (print out all field names)

1. In Create a button in xml

<Button
        android:text="visit sms"
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></Button>

2. Get the click event of the button in the background
1) Create ContentResolver() content resolver object: get – getContentResolver()
2) Create URI (URI: name of database queried) URI u = URI Parse ("short message database name (fixed): content://sms ”);
3)contentResolver .query(URI: u, String[] projection (which fields to query): null, query condition: null, condition value: null, sorting condition: null); Method of querying SMS database (null: query all fields, or new an array type field - know field)
4)

                //Returns data at the index location
                query.getString(0);

Illustration:

                //Move the cursor down one line
                query.moveToNext();

Illustration: generally, write a loop, return true and continue to execute the method body inside, return false and jump out of the loop.

                //Returns the contents under the field by index
                query.getColumnName(0);

Illustration:

                //Returns the current field index based on the field name
                query.getColumnIndex("");

Illustration:

Note: when using mysql to create a database, each field of each table has to write the type of field, but no matter what type is stored in the database under Android, it is of string type in the database.

                //Returns data at the index location
                query.getString(0);
                
                //Returns the number of fields
                query.getColumnCount();
                
                //Move the cursor down one line
                query.moveToNext();
                
                //Moving to a specific line is easy to cross the index, throw exceptions and report errors
                query.move(2);
                
                //Return the names of all fields in the table as array type
                query.getColumnNames();
                
                //Returns the contents under the field by index
                query.getColumnName(0);
                
                //Returns the current field index based on the field name
                query.getColumnIndex("");
                //Is it the first line, boolean type
                query.isFirst();

4) Through the returned result set query, list the SMS content (traverse and check the number of SMS messages)
String[] columnNames = query.getColumnNames(); Return the names of all fields in the table as array type
for loop – traversing fields:

for (int i=0;i<columnNames.length;i++){
                    Log.i("shit",columnNames[i]);
                }

3. Security authority
1) At androidmanifest XML (not through user)

<uses-permission android:name="android.permission.READ_SMS"></uses-permission>

2) Dynamic loading / dynamic application (the code is fixed) (after Android 6.0)
Judge whether the current APP has permission: contextcompat Checkselfpermission (mainactivity.this, corresponding to the permission in AndroidManifest.xml above, here is what: Manifest.permission.READ_SMS); The return value is int
Agreed: packagemanager PERMISSION_ Grant agrees on behalf of the user (0)
Disagree: packagemanager PERMISSION_ DENIED(-1){
Dynamic application permission: activitycompat Requestpermissions (mainactivity.this, permission of array type: new String [] {dynamic application parameter: Manifest.permission.READ_SMS}, request code: anything can be filled in, as long as it is int type 100);
}

int checkSelf= ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED);
            if (checkSelf ==PackageManager.PERMISSION_DENIED){
                ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.READ_SMS},100);
         }
         //It can also be written as
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, 100);
        }
         

3) Using dynamic permission application will trigger: onRequestPermissionsResult method: judge whether the user clicks agree or reject
requestCode is equal to the user-defined request code - permission is the permission to read information
@NonNull String[] permissions permission will be passed through the array type
@NonNull int[] grantResults result code is passed through the array
4) Dangerous authority

Rendering: print out the column names of all columns at the same time


MainActivity.java code:

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, 100);
        }


        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver contentResolver = getContentResolver();
                Uri u = Uri.parse("content://sms");
                Cursor query = contentResolver.query(u, null, null, null,null);
                String[] columnNames = query.getColumnNames();
                for (int i=0;i<columnNames.length;i++){
                    Log.i("shit",columnNames[i]);
                }
            }
        });
    }

}

Case: query the data of two mobile phones sending text messages to each other (each one is printed according to the field)

//Move the cursor down one line and read the data of each line
query.moveToNext();

while (query.moveToNext()) {
                    String line = "";
                    //Traverse each column in this row from 0
                    for (int i = 0; i < query.getColumnCount(); i++) {
                       line += query.getColumnName(i) + ":" + query.getString(i) + ",";

                   }
                   Log.i("shit", line);
                }

Run the new mobile phone to send text messages to the old mobile phone, then run the old mobile phone, and then visit sms. The result appears
design sketch:


MainActivity.java code:

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, 100);
        }


        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver contentResolver = getContentResolver();
                Uri u = Uri.parse("content://sms");
                Cursor query = contentResolver.query(u, null, null, null, null);

                while (query.moveToNext()) {
                    String line = "";
                    //Traverse each column in this row from 0
                    for (int i = 0; i < query.getColumnCount(); i++) {
                       line += query.getColumnName(i) + ":" + query.getString(i) + ",";

                   }
                   Log.i("shit", line);
                }
            }
        });
    }
}

Case: query contact (print out all field names)

1. In Create a button in xml

<Button
        android:text="Access contacts"
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"></Button>

2. Get the click event of the button in the background
1) Get the content resolver CR = getcontentresolver();
2)Cursor cs = cr . Query (the URI here is a constant (different from the previous one): contactscontract Contacts. CONTENT_ URI, which fields to query: null, query condition: null, condition value: null, sorting condition: null);
3) Traverse all fields

  String[] str=cs.getColumnNames();
                for (int i=0;i<str.length;i++){
                    Log.i("shit",str[i]);
                }

3. Security authority
1) At androidmanifest XML (not through user)

<uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

2) Dynamically apply for contact reading permission
Judge whether the current APP has permission: contextcompat Checkselfpermission (mainactivity.this corresponds to the permissions in AndroidManifest.xml above. Here is what: Manifest.permission.READ_CONTACTS); The return value is int
Agree: packagemanager PERMISSION_ Grant agrees on behalf of the user (0)
Disagree: packagemanager PERMISSION_ DENIED(-1){
Dynamic application permission: activitycompat Requestpermissions (mainactivity.this, permission of array type: new String [] {dynamic application parameter: Manifest.permission.READ_CONTACTS}, request code: anything can be filled in, as long as it is int type 200);
}

 if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 200);
        }

design sketch:

List all field names:

MainActivity.java code:

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, 100);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 200);
        }

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver contentResolver = getContentResolver();
                Uri u = Uri.parse("content://sms");
                Cursor query = contentResolver.query(u, null, null, null, null);


                while (query.moveToNext()) {
                    String line = "";
                    //Traverse each column in this row from 0
                    for (int i = 0; i < query.getColumnCount(); i++) {
                       line += query.getColumnName(i) + ":" + query.getString(i) + ",";

                   }
                   Log.i("shit", line);
                }

            }
        });
        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver cr = getContentResolver();
                Cursor cs = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


                String[] str=cs.getColumnNames();
                for (int i=0;i<str.length;i++){
                    Log.i("shit",str[i]);
                }
            }
        });
    }
}

Case: query contacts (each one is printed by field)

backstage:

 while (cs.moveToNext()) {
                    //Spell string form
                    String a = "";
                    for (int i = 0; i < cs.getColumnCount(); i++) {
                        a += cs.getColumnName(i) + ":" + cs.getString(i) + ",";
                    }
                    Log.i("shit", a);
                }

MainActivity.java code:

package com.example.myapplication;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.ContentResolver;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, 100);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_DENIED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_CONTACTS}, 200);
        }

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver contentResolver = getContentResolver();
                Uri u = Uri.parse("content://sms");
                Cursor query = contentResolver.query(u, null, null, null, null);

                while (query.moveToNext()) {
                    String line = "";
                    //Traverse each column in this row from 0
                    for (int i = 0; i < query.getColumnCount(); i++) {
                       line += query.getColumnName(i) + ":" + query.getString(i) + ",";

                   }
                   Log.i("shit", line);
                }

            }
        });
        findViewById(R.id.btn2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ContentResolver cr = getContentResolver();
                Cursor cs = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);


                while (cs.moveToNext()) {
                    //Spell string form
                    String a = "";
                    for (int i = 0; i < cs.getColumnCount(); i++) {
                        a += cs.getColumnName(i) + ":" + cs.getString(i) + ",";
                    }
                    Log.i("shit", a);
                }
            }
        });

    }


}

design sketch:

Tags: Android Android Studio

Posted by infiniteacuity on Tue, 19 Apr 2022 10:59:12 +0930