七,跨程序共享数据——内容提供器

内容提供器主要是为不同的应用程序间实现数据共享的功能。

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;
    }
}




    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值