このセクションの概要:
このセクションでは、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 に変更し、バックグラウンドでこのようなことを実行できます~