ほとんど/ ContactsContract.Intents.Insert
からのすべての値がデフォルトの連絡先アプリケーションでmodel/EntityModifier.java
クラスで処理されている - それはちょうどStructuredName.GIVEN_NAME
にInsert.NAME
から値を詰め込みます。
すべての名前コンポーネントをサポートするvCard 2.1(text/x-vcard)としてインポートすることはできますが、vCardファイルをsdcardにダンプするか、ContentResolver#openInputStream(Uri)
が読むことができるものsdcardや独自のContentProviderを指し示すURIを参照してください)。
動的にvCardを作成するのContentProviderを使用する簡単な例:
あなたの活動に:
Intent i = new Intent(Intent.ACTION_VIEW);
i.setDataAndType(Uri.parse("content://some.authority/N:Jones;Bob\nTEL:123456790\n"), "text/x-vcard");
startActivity(i);
あなたのContentProviderで(ACTION_VIEWインテントで使用権限のために登録):
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
try {
FileOutputStream fos = getContext().openFileOutput("filename.txt", Context.MODE_PRIVATE);
String vcard = "BEGIN:VCARD\nVERSION:2.1\n" +
uri.getPath().substring(1) +
"END:VCARD\n";
fos.write(vcard.getBytes("UTF-8"));
fos.close();
return ParcelFileDescriptor.open(new File(getContext().getFilesDir(), "filename.txt"), ParcelFileDescriptor.MODE_READ_ONLY);
} catch (IOException e) {
throw new FileNotFoundException();
}
}
これがトリガーされると、あなたのUriのパスに入れた名前の連絡先を電話帳に挿入する必要があります。ユーザーに複数の連絡先アカウントがある場合、そのアカウントを選択するよう求められます。
注: vCardの適切なエンコードはもちろん完全に無視されます。私は連絡先アプリのほとんどのバージョンをイメージします vCard 3.0もvCard 2.1と同様に脳死のエンコーディングを持っていません。
この方法では、仕事/携帯電話番号やその他の番号を追加することもできます。
Oh snap。気になることを編集したかったことに気付きました。これはほとんどの場合、連絡先を追加するだけです。アカウント名とタイプを定義すると、ユーザーに確認を求めることさえありません。 – Jens
答えてくれてありがとうJens。それは実際には面白い(しかし、ハッキーだが)アプローチである。 ACTION_INSERT_OR_EDITを使用してvcard(抽象化のいくつかのレイヤー上)をインテントに渡す方法がありますか? – Dino
私が知っているわけではありません - ACTION_INSERT_OR_EDITインテントは、デフォルトの連絡先アプリでサポートされているものがかなり限られています。 – Jens