内容提供器主要是为不同的应用程序间实现数据共享的功能。
1。了解运行时权限
新建项目修改activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wangyamin.runtimepermissiontest.MainActivity">
<Button
android:id="@+id/make_call"
android:layout_width="match_parent"
android:text="Make Call"
android:layout_height="wrap_content" />
</LinearLayout>
修改MainActivity中的代码 动态检查并申请权限
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button makeCall = (Button)findViewById(R.id.make_call);
makeCall.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/*try {
Intent intent = new Intent( Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}catch ( SecurityException e){
e.printStackTrace();
}*/
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions( MainActivity.this, new String[]{Manifest.permission.CALL_PHONE},1);
}else{
call();
}
}
});
}
private void call(){
try {
Intent intent = new Intent( Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:10086"));
startActivity(intent);
}catch ( SecurityException e){
e.printStackTrace();
}
}
@Override //权限请求结束调用该函数
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch ( requestCode ){
case 1:
if ( grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ) {
call();
}else{
Toast.makeText( this,"you denied the permission", Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
}
}
修改AndroidManifest.xml文件在其中申明权限,不然无法安装应用程序
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wangyamin.runtimepermissiontest">
<uses-permission android:name="android.permission.CALL_PHONE"/>
<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">
<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>
2.借助内容提供器访问其他程序中的数据 ContentResolve
如果要访问内容提供器中的共享数据,就要借助 ContentResolve类 可以通过Context中的getContentResolver()方法获取该类的实例。ContentResolve的CURD操作不是接收表名作为参数,而是使用Uri参数替代 给数据建立了唯一标示主要由两部分组成 authory和path
读取系统联系人实例:
1.ListView中显示信息
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.wangyamin.contactstest.MainActivity">
<ListView
android:id="@+id/contacts_view"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</LinearLayout>
2.修改Main_Activity
public class MainActivity extends AppCompatActivity {
private static final String TAG = "phoneShow";
ArrayAdapter<String> adapter;
List<String> contactsList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView contactsView = (ListView)findViewById(R.id.contacts_view);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,contactsList);
contactsView.setAdapter(adapter);
if (ContextCompat.checkSelfPermission( this, Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions( this, new String[]{ Manifest.permission.READ_CONTACTS},1);
}else{
readContacts();
}
}
private void readContacts() {
Cursor cursor = null;
try{
cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,null,null,null);
if( cursor != null){
while( cursor.moveToNext()){
String displayName = cursor.getString( cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
Log.d(TAG, "readContacts: "+ displayName);
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contactsList.add( displayName+"\n"+number);
}
adapter.notify();
}
}catch ( Exception e){
e.printStackTrace();
}finally {
if(cursor!=null){
cursor.close();
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch ( requestCode){
case 1:
if( grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED ){
readContacts();
}else{
Toast.makeText( this,"you denied permission",Toast.LENGTH_SHORT).show();
}
break;
default:
}
}
}
3.AndroidManifest.xml文件增加权限说明
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wangyamin.contactstest">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<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">
<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>
三,创建自己的内容提供器
可以通过新建一个类去继承ContentProvider的方式来创建一个自己的内容提供器,需要重写6个方法
onCreate() query() insert() update() delete() getType()
右击
com.example.wangyamin.databasetest包 ——> new - Other-Content Provider 创建内容提供器
package com.example.wangyamin.databasetest;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
public class DatabaseProvider extends ContentProvider {
public static final int BOOK_DIR = 0;
public static final int BOOK_ITEM =1;
public static final int CATEGORY_DIR = 2;
public static final int CATEGORY_ITEM = 3;
public static final String AUTHORITY = "com.example.wangyamin.databasetest.provider";
private static UriMatcher uriMatcher;
private MyDatabaseHelper dbHelper;
static{
uriMatcher = new UriMatcher( UriMatcher.NO_MATCH );
uriMatcher.addURI( AUTHORITY, "book", BOOK_DIR);
uriMatcher.addURI(AUTHORITY, "book/#", BOOK_ITEM );
uriMatcher.addURI(AUTHORITY, "category", CATEGORY_DIR);
uriMatcher.addURI(AUTHORITY, "category/#", CATEGORY_ITEM);
}
public DatabaseProvider() {
}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
// Implement this to handle requests to delete one or more rows.
//throw new UnsupportedOperationException("Not yet implemented");
SQLiteDatabase db = dbHelper.getWritableDatabase();
int deletedRows = 0;
switch ( uriMatcher.match(uri) ){
case BOOK_DIR:
deletedRows = db.delete("Book", selection, selectionArgs);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
deletedRows = db.delete("Book", "id = ?", new String[] { bookId});
break;
case CATEGORY_DIR:
deletedRows = db.delete( "Category",selection, selectionArgs );
break;
case CATEGORY_ITEM:
String categoryId = uri.getPathSegments().get(1);
deletedRows = db.delete( "Category","id = ?", new String[]{ categoryId} );
break;
default:
break;
}
return deletedRows;
}
@Override
public String getType(Uri uri) {
// TODO: Implement this to handle requests for the MIME type of the data
// at the given URI.
//throw new UnsupportedOperationException("Not yet implemented");
switch ( uriMatcher.match(uri) ){
case BOOK_DIR:
return "vnd.android.cursor.dir/vnd.com.example.wangyamin.databasetest.provider.book";
case BOOK_ITEM:
return "vnd.android.cursor.item/vnd.com.example.wangyamin.databasetest.provider.book";
case CATEGORY_DIR:
return "vnd.android.cursor.dir/vnd.com.example.wangyamin.databasetest.provider.category";
case CATEGORY_ITEM:
return "vnd.android.cursor.item/vnd.com.example.wangyamin.databasetest.provider.category";
}
return null;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO: Implement this to handle requests to insert a new row.
//throw new UnsupportedOperationException("Not yet implemented");
SQLiteDatabase db = dbHelper.getWritableDatabase();
Uri uriReturn = null;
switch ( uriMatcher.match(uri)){
case BOOK_DIR:
case BOOK_ITEM:
long newBookId = db.insert( "Book", null, values );
uriReturn = Uri.parse("content://"+AUTHORITY+"/book/"+newBookId );
break;
case CATEGORY_DIR:
case CATEGORY_ITEM:
long newCategoryId = db.insert( "Category",null,values );
uriReturn = Uri.parse("content://"+AUTHORITY+"/book/"+newCategoryId);
break;
default:
break;
}
return uriReturn;
}
@Override
public boolean onCreate() {
// TODO: Implement this to initialize your content provider on startup.
dbHelper = new MyDatabaseHelper( getContext(), "BookStore.db",null,6);
return true;
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
// TODO: Implement this to handle query requests from clients.
// throw new UnsupportedOperationException("Not yet implemented");
SQLiteDatabase db = dbHelper.getReadableDatabase();
Cursor cursor = null;
switch ( uriMatcher.match(uri) ){
case BOOK_DIR:
cursor = db.query( "Book", projection, selection, selectionArgs, null, null,sortOrder);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
cursor = db.query("Book",projection, "id = ?", new String[]{ bookId}, null, null, sortOrder);
break;
case CATEGORY_DIR:
cursor = db.query( "Category", projection,selection,selectionArgs,null,null,sortOrder);
break;
case CATEGORY_ITEM:
String categoryId = uri.getPathSegments().get(1);
cursor = db.query( "Category", projection, "id = ?", new String[]{ categoryId}, null,null,sortOrder);
break;
default:
break;
}
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
// TODO: Implement this to handle requests to update one or more rows.
//throw new UnsupportedOperationException("Not yet implemented");
SQLiteDatabase db = dbHelper.getWritableDatabase();
int updateRows = 0;
switch ( uriMatcher.match(uri) ){
case BOOK_DIR:
updateRows = db.update( "Book", values, selection, selectionArgs);
break;
case BOOK_ITEM:
String bookId = uri.getPathSegments().get(1);
updateRows = db.update("Book",values, "id = ?", new String []{ bookId} );
break;
case CATEGORY_DIR:
updateRows = db.update("Book",values,selection,selectionArgs );
break;
case CATEGORY_ITEM:
String categoryId = uri.getPathSegments().get(1);
updateRows = db.update( "Book", values, "id = ?", new String[] { categoryId} );
break;
default:
break;
}
return updateRows;
}
}