2011-09-25 11 views
9

私はアンドロイドのネイティブ "連絡先の追加または編集"アクティビティを、フォームに既にあるデータで起動しようとしています。これは私が現在使用しているコードです:インテントで名と姓の連絡先を追加する方法

Intent intent = new Intent(Intent.ACTION_INSERT_OR_EDIT); 
intent.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); 

intent.putExtra(Insert.NAME, "A name"); 
intent.putExtra(Insert.PHONE, "123456789"); 
startActivity(intent); 

私の問題は私が姓と名を指定したいということです。私はまた、必要なすべてのフィールドの定数識別子を含むStructuredNameクラスがあることに気付きました。残念ながら、私は意図にStructuredNameフィールドを追加することができませんでした...

これはどのように正しく行われて知っていますか?

注:連絡先を直接追加するつもりはありませんが、「連絡先を追加」ダイアログが表示されます。

おかげ 当たり前

答えて

2

ほとんど/ ContactsContract.Intents.Insertからのすべての値がデフォルトの連絡先アプリケーションでmodel/EntityModifier.javaクラスで処理されている - それはちょうどStructuredName.GIVEN_NAMEInsert.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と同様に脳死のエンコーディングを持っていません。

この方法では、仕事/携帯電話番号やその他の番号を追加することもできます。

+0

Oh snap。気になることを編集したかったことに気付きました。これはほとんどの場合、連絡先を追加するだけです。アカウント名とタイプを定義すると、ユーザーに確認を求めることさえありません。 – Jens

+0

答えてくれてありがとうJens。それは実際には面白い(しかし、ハッキーだが)アプローチである。 ACTION_INSERT_OR_EDITを使用してvcard(抽象化のいくつかのレイヤー上)をインテントに渡す方法がありますか? – Dino

+0

私が知っているわけではありません - ACTION_INSERT_OR_EDITインテントは、デフォルトの連絡先アプリでサポートされているものがかなり限られています。 – Jens

関連する問題