Android の ContentProvider に関する予備調査

このセクションの概要:

このセクションでは、Android の 4 つの主要コンポーネントの最後の ContentProvider (コンテンツ プロバイダー) について説明します。読者の中には、「Android には 5 つの主要コンポーネントがあるのでは? インテントはあるの?」という質問があるかもしれません。はい、インテントも非常に重要です。しかし、彼はこれらのコンポーネント間のリンクを維持しているだけです。意図については次の章で説明します。この ContentProvider について言えば、いつ使用するのでしょうか? 次の 2 つのタイプがあります。

  • 1.独自のアプリケーション内の他のアプリケーション、または携帯電話の連絡先、テキスト メッセージなど、ContentProvider によって公開された一部のデータにアクセスしたいと考えています。これらのデータを読み取りまたは変更したいのですが、それには ContentProvider を使用する必要があります。
  • 2.私たち自身のアプリケーションでは、他のアプリケーションが読み取りまたは操作できるように独自のデータの一部を公開したいと考えています。また、ContentProvider を使用することもできます。さらに、公開するデータを選択できるため、プライベート データの損失を回避できます。 . 道を譲ってください!

ContentProvider について学ぼう~ 公式ドキュメント: ContentProvider このセクションでは、ContentProvider の概念を説明し、よく使われるシステム ContentProvider の例をいくつか書きます。独自の ContentProvider を定義してください!


1. ContentProvider の概念の説明:


2. システムが提供する ContentProvider を使用する

実際、多くの場合、私たちは ContentProvider を自分自身のデータを公開するために使用するのではなく、  ContentResolverを通じて他のアプリケーションから情報を読み取るために使用することが多く、最も一般的に使用されるのは、システム APP、情報、連絡先、マルチメディア情報などを読み取ることです。これらの ContentProvider を呼び出したい場合は、関連する API 情報を自分で確認する必要があります。さらに、異なるバージョンは異なる URL に対応する場合があります。URL と対応するデータベース テーブル フィールドを取得する方法は次のとおりです。ここでは最も一般的に使用される連絡先を例として取り上げます。その他は自分でググることができます~ ① システム ソース コード ファイルに移動します: all-src.rar ->
TeleponeProvider -> AndroidManifest.xml で対応する API を見つけます。
②エミュレータのファイル Explorer/data/data/com.android.providers.contacts/databases/contact2.db を開き、エクスポート後に SQLite グラフィック ツールを使用して、3 つのコア テーブルを表示します。 raw_contactテーブルデータ テーブルMIME タイプ テーブル!
基本的な操作例をいくつか示します。


1) 受信箱の情報を読むだけです。

コアコード:

private void getMsgs(){ 
    Uri uri = Uri.parse("content://sms/"); 
    ContentResolver リゾルバー = getContentResolver(); 
    //取得するのはこれらの列の情報
    Cursor Cursor =solver.query(uri, new String[]{"address","date","type","body"}, null, null, null); 
    while(cursor.moveToNext()) 
    {
        文字列アドレス =cursor.getString(0); 
        文字列日付 = カーソル.getString(1); 
        文字列型 =cursor.getString(2); 
        文字列本体 = カーソル.getString(3); 
        System.out.println("地址:" + address); 
        System.out.println("時刻:" + 日付); 
        System.out.println("タイプ:" + type); 
        システムアウト。
        システムアウト。
    }
    カーソル.クローズ(); 
}

受信トレイを読み取る権限を AndroidManifest.xml に追加することを忘れないでください。

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

操作結果:

実行結果の一部は次のとおりです。


2) 受信トレイにメッセージを挿入するだけです

コアコード:

private void insertMsg() { 
    ContentResolver リゾルバー = getContentResolver(); 
    Uri uri = Uri.parse("content://sms/"); 
    ContentValues conValues = new ContentValues(); 
    conValues.put("アドレス", "123456789"); 
    conValues.put("タイプ", 1); 
    conValues.put("日付", System.currentTimeMillis()); 
    conValues.put("body", "ノーズオノーダイ、なぜ試すのですか!"); 
    solver.insert(uri, conValues); 
    Log.e("HeHe", "短信插入完毕~"); 
}

操作結果:

予防:

上記のコードは4.4以下ではテキストメッセージを書き込む機能を実現できましたが、5.0以降ではデフォルトのSMSアプリ以外のソフトウェアがテキストメッセージに書き込む形でテキストメッセージを送信できなくなったため、5.0では書き込むことができません。データベース!


3) 電話連絡先を読み取るだけ

コアコード:

private void getContacts(){ 
    //①raw_contacts テーブルをクエリして連絡先の ID を取得します
    ContentResolversolver = getContentResolver(); 
    Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 
    // 連絡先データをクエリ
    Cursor =solver.query(uri , null , null, null, null); 
    while(cursor.moveToNext()) 
    { 
        //連絡先名、電話番号を取得
        String cName =cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
        String cNum =cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        System.out.println("Name:" + cName); 
        System.out.println("Number:" + cNum); 
} 
        System.out 。println("========================);
    カーソル
    .close();

連絡先を読み取る権限を忘れずに追加してください。

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

操作結果:

実行結果の一部は次のとおりです。


4) 指定した電話機の連絡先情報を問い合わせます

コアコード:

private void queryContact(文字列番号){ 
        Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + 番号); 
        ContentResolver リゾルバー = getContentResolver(); 
        カーソル Cursor =solver.query(uri, new String[]{"display_name"}, null, null, null); 
        if (cursor.moveToFirst()) {
            文字列名 =cursor.getString(0); 
            System.out.println(数値 + "对应的联系人名:" + 名前); 
        カーソル
    .close(); 
}

操作結果:


5) 新しい連絡先を追加します

コアコード:

private void AddContact() throws RemoteException, OperationApplicationException { 
    //トランザクションを使用して連絡先を追加します
    Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); 
    Uri dataUri = Uri.parse("content:/ /com.android.contacts/data"); 

    ContentResolver リゾルバー = getContentResolver(); 
    ArrayList<ContentProviderOperation> 操作 = new ArrayList<ContentProviderOperation>(); 
    ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri) 
            .withValue("account_name", null ) 
            .build(); 
    operations.add(op1); 

    //名前、番号、郵便番号の順
    ContentProviderOperation op2 = ContentProviderOperation.newInsert(dataUri)
            .withValueBackReference("raw_contact_id", 0) 
            .withValue("mimetype", "vnd.android.cursor.item/name") 
            .withValue("data2", "Coder-pig") 
            .build(); 
    操作.add(op2); 

    ContentProviderOperation op3 = ContentProviderOperation.newInsert(dataUri) 
            .withValueBackReference("raw_contact_id", 0) 
            .withValue("mimetype", "vnd.android.cursor.item/phone_v2") 
            .withValue("data1", "13798988888") 
            .withValue ("データ2", "2") 
            .build(); 
    オペレーション。追加(op3); 

    ContentProviderOperation op4 = ContentProviderOperation.newInsert(dataUri)
            .withValueBackReference("raw_contact_id", 0) 
            .withValue("mimetype", "vnd.android.cursor.item/email_v2") 
            .withValue("data1", "[email protected]") 
            .withValue("data2", "2") 
            .build(); 
    operations.add(op4); 
    //上記の内容を電話の連絡先に追加します~ 
    resolver.applyBatch("com.android.contacts",operations); 
    Toast.makeText(getApplicationContext() , "正常に追加されました", Toast.LENGTH_SHORT).show(); 
}

操作結果:

権限についても忘れないでください。

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

3. カスタム コンテンツ プロバイダー

アプリケーションのデータを他のアプリケーションに公開したくないことが多いため、ContentProvider を自分で定義することはほとんどありません。それでも、ContentProvider の使い方を学ぶ必要があります。データ送信の方法がもう 1 つあります。 ~ これは
フローチャートを描く前です:

次に、それを段階的に実装してみましょう。

始める前に、データベース作成クラスを作成する必要があります (データベースの内容については後で説明します~)。

DBOpenHelper.java

public class DBOpenHelper extends SQLiteOpenHelper { 

    final String CREATE_SQL = "CREATE TABLE test(_id INTEGER PRIMARY KEY AUTOINCREMENT,name)"; 
    
    public DBOpenHelper(コンテキスト コンテキスト、文字列名、CursorFactory ファクトリ、
            int バージョン) { 
        super(コンテキスト、名前、null、1); 
    @Override public void 

    
    onCreate 
    (SQLiteDatabase db) { 
        db.execSQL(CREATE_SQL); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
        // TODO 自動生成されたメソッド スタブ

    } 

}

ステップ 1 : ContentProvider クラスをカスタマイズし、onCreate()、getType() を実装し、要件に応じて対応する追加、削除、変更、クエリ メソッドを書き換えます。

NameContentProvider.java

public class NameContentProvider extends ContentProvider { 

    //いくつかの定数を初期化します
     private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);         
     private DBOpenHelper dbOpenHelper; 
    
    //UriMatcher を直接使用するため、ここでは addURI を追加し、Matcher を呼び出して
     
     static{   
         matcher. addURI ("com.jay.example.providers.myprovider", "test", 1); 
     }   
     
    @Override 
    public boolean onCreate() { 
        dbOpenHelper = new DBOpenHelper(this.getContext(), "test.db", null, 1 ) ; 
        true を返す; 
    } 

    @Override 
    public Cursor query(Uri uri, String[] project, String selected, 
            String[] selectedArgs, String sortOrder) {
        return null; 
    } 

    @Override 
    public String getType(Uri uri) { 
        return null; 
    } 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
        
        switch(matcher.match(uri)) 
        { 
        //データベースを開いてput内部 URI が完全に一致していることを証明したい場合
        1: 
            SQLiteDatabase db = dbOpenHelper.getReadableDatabase(); 
            long rowId = db.insert("test", null, names); 
            if(rowId > 0) 
            { 
                //後に追加既存の Uri ID 
                Uri nameUri = ContentUris.withAppendedId(uri, rowId); 
                //通知データが変更されました
                getContext().getContentResolver().notifyChange(nameUri, null); 
                nameUri を返します。
            nullを
        返し
        ます。
    @Override 
    public int delete(Uri uri, String selected, String[]selectionArgs) { 
    return 
        0; 
    @Override 
    public int update(Uri uri, ContentValues 値, 文字列選択, 
    String 
            [] selectArgs) { 
        return 0; 
    } 
}


ステップ 2 : AndroidManifest.xml に ContentProvider を登録します。

<!-- 属性は次のとおりです: 完全修飾クラス名、照合用の URI、データを共有するかどうか --> 
<provider android:name="com.jay.example.bean.NameContentProvider" 
            android:authorities="com.jay 。 example.providers.myprovider" 
            android:exported="true" />

OK、ContentProvider 部分は完了です。


次に、新しいプロジェクトを作成し、ContentResolver 部分を実装しましょう。ボタンをクリックしてデータを直接挿入します。

MainActivity.java

public class MainActivity extends Activity { 

    private Button btninsert; 
    
    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        
        btninsert = (ボタン) findViewById(R.id.btninsert); 
        
        //读取contentprovider 数据  
        final ContentResolversolver = this.getContentResolver(); 
        
        
        btninsert.setOnClickListener(new OnClickListener() { 
            
            @Override 
            public void onClick(View v) { 
                 ContentValues value = new ContentValues(); 
                 value.put("name", "测试");
                 Uri uri = Uri.parse("content://com.jay.example.providers.myprovider/test"); 
                solver.insert(uri, 値); 
                Toast.makeText(getApplicationContext(), "データ插入成功", Toast.LENGTH_SHORT).show(); 
                
            } 
        }); 
       
    } 
}

使い方? コードは非常に単純です。最初にプロジェクトを ContentProvider として実行し、次に ContentResolver のプロジェクトを実行し、ボタンをクリックしてデータを挿入します。次に、ファイル エクスプローラーを開いて ContentProvider の db データベースを取り出し、挿入されたデータを表示するグラフィック表示ツール。時間の制約により、結果は示されません~


4. ContentObserver を通じて ContentProvider のデータ変更を監視する

使用ガイド

プログラムを実行したら、そのまま放置します。テキスト メッセージを受信したら、logcat でメッセージの内容を確認できます。必要に応じて Activtiy を Service に変更し、バックグラウンドでこのようなことを実行できます~

おすすめ

転載: blog.csdn.net/leyang0910/article/details/131332444