ContentProvider に関する予備調査


このセクションの紹介:

このセクションで説明するのは、Android の 4 つの主要コンポーネントの最後の ContentProvider (コンテンツ プロバイダー) です。読者によっては、 「Android には 5 つの主要なコンポーネントがあるのではありませんか? では、Intent はどうなるのでしょうか? はい、Intent も非常に重要ですが、それは」という質問があります。 これらのコンポーネント間の接続を維持するだけです。インテントについては次の章で解説していきます!この ContentProvider について話すのはいつですか? 彼は利用されるだろうか? 2 つのタイプがあります:

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

騙すのは簡単そうに見えますが、実際の使い方はとても簡単です。ContentProvider について学びましょう~公式ドキュメント: ContentProviderこのセクションでは、ContentProvider の概念を説明し、いくつかの一般的な使用方法を書き留めます。システム ContentProvider の例。 そしてカスタム ContentProvider!


ContentProvider の概念の説明:

1.jpg


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) 受信トレイ情報の単純な読み取り:

コアコード:

private void getMsgs(){
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 に、受信トレイを読み取る権限を追加します:

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

実行結果:

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

2.png


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

コアコード:

private void insertMsg() {
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挿入完了~");
}

実行結果:

3.png

注:

上記のコードは 4.4 以下のテキスト メッセージを書き込む機能を実現できますが、5.0 では次の理由から書き込むことができません。 5.0 以降、デフォルトの SMS アプリケーション以外のソフトウェアは、SMS データベースに書き込んでテキスト メッセージを送信できません。


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.CommonData) Kinds.Phone.NUMBER));
System.out.println("名前:" + cName);
System.out.println("番号:" + cNum);
System.out.println("============ ===========);
}
cursor.close();
}

連絡先を読み取る権限を追加することを忘れないでください:

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

実行結果:

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

4.png


4) 指定された電話番号の連絡先情報をクエリします

コアコード:

private void queryContact(Stringnumber ){
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.png


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



実行結果:

権限を忘れないでください:

6.gif

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


3. カスタム ContentProvider

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

7.jpg

次にそれを実装します。ステップバイステップ:

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

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(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

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);
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);
btninsert = (Button) findViewById(R.id.btninsert);

/ /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 のデータ変更を監視します

8.jpg

使用ガイド:

テキスト メッセージを送信した後、logcat でメッセージの内容を確認でき、必要に応じてカスタマイズできます。 Activtiy を Service に変更し、このようなことをバックグラウンドで実行します~


このセクションの概要:

さて、ContentProvider の予備調査はこれで終わりです。 ContentProvider の概念とプロセス、システムによって提供される ContentProvider の使用、および独自の ContentProvider のカスタマイズ、 最後にContentObserverでContentProviderのデータ変更を監視する方法も説明し、ContentProviderの内容はほぼマスターしました。 わかりました。次のセクションでドキュメントを読んで、わからないことを確認しましょう~ありがとう