ContentProvider に関する予備調査
このセクションの紹介:
このセクションで説明するのは、Android の 4 つの主要コンポーネントの最後の ContentProvider (コンテンツ プロバイダー) です。読者によっては、 「Android には 5 つの主要なコンポーネントがあるのではありませんか? では、Intent はどうなるのでしょうか? はい、Intent も非常に重要ですが、それは」という質問があります。 これらのコンポーネント間の接続を維持するだけです。インテントについては次の章で解説していきます!この ContentProvider について話すのはいつですか? 彼は利用されるだろうか? 2 つのタイプがあります:
- 1.独自のアプリケーション内の他のアプリケーション、または ContentProvider によって公開された一部のデータにアクセスしたい、 携帯電話の連絡先、テキストメッセージなど!このデータを読み取りまたは変更したいので、ContentProvider を使用する必要があります。
- 2.私たち自身のアプリケーションは、他のアプリケーションが読み取りまたは操作できるようにそのデータの一部を公開したいと考えています。 ContentProvider に対して、公開するデータを選択することもできるため、個人データの漏洩を回避できます。
騙すのは簡単そうに見えますが、実際の使い方はとても簡単です。ContentProvider について学びましょう~公式ドキュメント: ContentProviderこのセクションでは、ContentProvider の概念を説明し、いくつかの一般的な使用方法を書き留めます。システム ContentProvider の例。 そしてカスタム ContentProvider!
ContentProvider の概念の説明:
2. システムによって提供される ContentProvider を使用します
実際、ContentProvider を使用する場合、多くの場合、私たちは自分自身のデータを公開しません。 ContentResolver を通じて読み取ります 他のアプリケーションから情報を取得するために、最も一般的に使用される方法は、システム APP、情報、連絡先を読み取ることです。 マルチメディア情報などなど!これらの ContentProvider を呼び出したい場合は、関連する API 情報を自分で確認する必要があります。 さらに、異なるバージョンは異なる URL に対応する場合があります。 URL と対応するデータベース テーブルのフィールドを取得する方法は次のとおりです。 ここでは、最も一般的に使用される連絡先を例に挙げます。その他については、Google~
①システム ソース コード ファイルに移動します: all-src.rar -> TeleponeProvider -> AndroidManifest.xml に移動して、対応する API を見つけます
②ファイルを開きます。 Explorer/エミュレータのデータ /data/com.android.providers.contacts/databases/contact2.db エクスポートした後、SQLite グラフィック ツールを使用して、3 つのコア テーブル (raw_contact テーブル、data テーブル、mimetypes テーブル) を表示します。
いくつかの基本的な操作例を以下に示します:
1) 受信トレイ情報の単純な読み取り:
コアコード:
Uri uri = Uri.parse("content://sms/");
ContentResolversolver = getContentResolver();
//どの列の情報を取得するか
カーソル カーソル = リゾルバー。 (uri, new String[]{"address","date","type","body"}, null, null, null);
while(cursor.moveToNext())
{
文字列アドレス = getString. (0);
文字列日付 =cursor.getString(1);
文字列型 =cursor.getString(2);
文字列本体 =cursor.getString(3);
System.out.println("アドレス:" + アドレス);
System.out.println("Time:" + date);
System.out.println("Type:" + type);
System.out.println("Content:" + body);
システム 。 out.println("=========================);
}
cursor.close();
}
忘れずに行ってくださいAndroidManifest.xml に、受信トレイを読み取る権限を追加します:
実行結果:
実行結果の一部は次のとおりです:
2) 受信トレイにメッセージを挿入するだけです
コアコード:
ContentResolv ersolver = getContentResolver();
Uri uri = Uri.parse("content://sms/");
ContentValues conValues = new ContentValues();
conValues.put("address", "123456789" );
conValues.put ("type", 1);
conValues.put("date", System.currentTimeMillis());
conValues.put("body", "ノーズオノーダイ、なぜ試すのですか!") ;
solver.insert(uri, conValues);
Log.e("HeHe", "SMS挿入完了~");
}
実行結果:
注:
上記のコードは 4.4 以下のテキスト メッセージを書き込む機能を実現できますが、5.0 では次の理由から書き込むことができません。 5.0 以降、デフォルトの SMS アプリケーション以外のソフトウェアは、SMS データベースに書き込んでテキスト メッセージを送信できません。
3) 携帯電話の連絡先の単純な読み取り
コアコード:
//①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.CommonData) Kinds.Phone.NUMBER));
System.out.println("名前:" + cName);
System.out.println("番号:" + cNum);
System.out.println("============ ===========);
}
cursor.close();
}
連絡先を読み取る権限を追加することを忘れないでください:
実行結果:
実行結果の一部は次のとおりです:
4) 指定された電話番号の連絡先情報をクエリします
コアコード:
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + 数値);
ContentResolver リゾルバー = getContentResolver();
カーソル カーソル =solver.query(uri, new String[]{"display_name"}, null, null, null);
if (cursor.moveToFirst()) {
String name =cursor.getString(0);
System.out.println(number + "対応する連絡先名前:" + 名前);
;
実行結果:
5) 新しい連絡先を追加します
コアコード:
//使用事务追加联系人
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse ("content://com.android.contacts/data");
ContentResolver resolver = getContentResolver();
ArrayList<ContentProviderOperation> 操作 = 新しい 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.cur) sor.item/name")
.withValue(" data2","Coder-pig")
.build();
operations.add(op2);
ContentProviderOperation op3 = ContentProviderOperation.newInsert(dataUri)
.withValueBackReference("raw_ contact_id",0)
.withValue("mimetype ","vnd.android.cursor.item/phone_v2")
.withValue("data1", "13798988888")
.withValue("data2", "2")
.build();
oper ations.add(op3 );
ContentProviderOperation op4 = ContentProviderOperation.newInsert(dataUri)
.withValueBackReference("raw_contact_id", 0)
.withValue("mimetype", "vnd.android.cursor.item/email_v2")
.withValue("data1", "779878443@qq.com")
.withValue("data2", "2")
.build " 正常に追加されました", Toast.LENGTH_SHORT).show();
}
実行結果:
権限を忘れないでください:
<uses-permission android:name="android.許可。WRITE_CONTACTS"/><uses-permission android:name="android.permission.WRITE_PROFILE"/>
3. カスタム ContentProvider
アプリケーション データを公開したくないことが多いため、ContentProvider を自分で定義することはほとんどありません。 他のアプリケーションでは、それでも ContentProvider の使い方を学ぶ必要があります。データ送信の方法がもう 1 つありますね~
これは以前に描いたフローチャートです:
次にそれを実装します。ステップバイステップ:
始める前に、まずデータベース作成クラスを作成する必要があります (データベースの内容については後で説明します~):
DBOpenHelper.java
final String CREATE_SQL = "CREATE TABLE test(_id INTEGER PRIMARY KEY AUTOINCREMENT,name)";
public DBOpenHelper(コンテキスト コンテキスト, 文字列名, CursorFactory ファクトリ,
int バージョン) {
super(context, name, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_SQL);
}
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
自動生成されたメソッド スタブ
}
}
ステップ 1: ContentProvider クラスをカスタマイズし、onCreate()、getType() を実装し、必要に応じて対応する追加、削除、変更、検索メソッドを書き換えます:
NameContentProvider.java
//いくつかの定数を初期化します
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);
Return true;
}@osomeride
Pursor クエリ (Uri Uri, String [] Project, String Selection,
) ST Raining [] selectargs, string sortOrder) {d Return null;
}@v@v@Public String Gettype (Uri Uri) {
Return Null; ContentValues Values) {
Switch (Matcher.match (URI)
) {
//データベースを開くことは、uriを一致させるケース1:
sqlitedatabase db = dbopenhelper.getReadabledAbase();//既存の Uri の後に ID を追加します
Uri nameUri = ContentUris.withAppendedId(uri, rowId);
名前を返すUri; 戻る、、、、、、、、、、、、、、ContentValues値、文字列選択、
<!-- 属性の順序: 完全修飾クラス名、照合に使用される URI、データを共有するかどうか -->
<provider android:name="com. jay.example.bean.NameContentProvider"
android:authorities="com.jay.example .providers.myprovider"
android:exported="true"
さて、ContentProvider としての部分は完了です!
次に、新しいプロジェクトを作成し、ContentResolver 部分を実装しましょう。ボタンをクリックしてデータを直接挿入します。
@Override protected void onCreate(Bundle SavedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);/ /ContentProvider データの読み取り
最終 ContentResolver Resolver = this.getContentResolver ();
dei public void Onclick (view v) {
ContentValues 値 = New ContentValues () ;
values.put("name", "测试");
Uri uri = Uri.parse("content://com.jay.example.providers.myprovider/test");
re solver.insert(uri, values) ;
toast.makeText(getApplicationContext()、 "data insertion succups"、toast.length_short).show();
使い方は? コードは非常に単純です。最初にプロジェクトを ContentProvider として実行し、次にプロジェクトを ContentResolver として実行します。 ボタンをクリックしてデータを挿入し、ファイル エクスプローラーを開いて ContentProvider の DB データベースを取り出し、グラフィカル表示ツールを使用します。 挿入されたデータと時間の関係は、表示することで確認できます。結果は示しません。
4. ContentObserver を通じて ContentProvider のデータ変更を監視します
使用ガイド:
テキスト メッセージを送信した後、logcat でメッセージの内容を確認でき、必要に応じてカスタマイズできます。 Activtiy を Service に変更し、このようなことをバックグラウンドで実行します~
このセクションの概要:
さて、ContentProvider の予備調査はこれで終わりです。 ContentProvider の概念とプロセス、システムによって提供される ContentProvider の使用、および独自の ContentProvider のカスタマイズ、 最後にContentObserverでContentProviderのデータ変更を監視する方法も説明し、ContentProviderの内容はほぼマスターしました。 わかりました。次のセクションでドキュメントを読んで、わからないことを確認しましょう~ありがとう