Android Code: Mehrere Kontakte anfügen mit Person, Email, Telefon mit Batch Operationen
Im folgenden Android Java Code Beispiel wird einem Android Smartphone einer oder mehrer Kontakte mit Angaben zur Person, zur Email und zur Telefonnummer an die Kontakte des Smartphones angefügt.
Das Einfügen der Kontakte wird in einem Operations-Batch Verfahren ausgeführt also nicht über die sichtbaren Intent-Formulare.
Nachdem der Java App Code durchgelaufen ist, findet man in den Kontakten des Smartphones den neuen Kontakt wieder.
Dieser besteht aus Vornamen und Nachnamen, einem Phone Eintrag und einem Email Eintrag.
Video Tutorial
Android Studio #24: Add Contacts Person Email Phone by Batch Operations
Java Code Erläuterung:
Die zentrale Methode, welche die Kontakte anfügt, heißt:
public void fxAdd_RawContact() {..}
Im ersten Schritt wird eine Liste erstellt, welche Operations-Befehle als Stapelbearbeitung aufnehmen kann
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
|
Anschliessend wird ein leerer neuer Kontakt angelegt.
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)//accountType=null
.withValue(RawContacts.ACCOUNT_NAME, null) //accountName=null
.build());
|
Im dritten Schritt werden in diesen leeren Kontakt die Personen-Daten angefügt
//< Person >
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContact_NewID)// rawContact_NewID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, sDisplayName) // Name of the person
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, sLastname)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, sFirstname)
.build());
//</ Person >
|
Und im Schritt 4 und 5 jeweils die Email und die Telefon als zusätzlicher Informationsblock. Diese Stapel Operationen-Befehle sind separat, da die Informationen wie Child-Blöcke unterhalb des Kontakts angehängt werden. So könnten auch mehrere Telefon-Nummern als Blöcke jeweils zum Hauptkontakt angefügt werden.
//< Email >
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContact_NewID)// rawContact_NewID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA, sEmail)
.build());
//</ Email >
//< Phone >
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContact_NewID)// rawContact_NewID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, sPhoneNr)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME )
.build());
//</ Phone >
|
Anschliessend wird der Bearbeitungsstapel ausgeführt.
res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
|
Folgend die kompletten Code-Seiten:
MainActivity.java
package de.rue25.a2016_09_22_add_new_contactraw;
import android.content.ContentProviderOperation;
import android.content.ContentProviderResult;
import android.content.OperationApplicationException;
import android.content.res.Resources;
import android.net.Uri;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.ContactsContract.RawContacts;
//import android.provider.ContactsContract.Contacts;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
public void btnAdd_Contact_onClick(View view) {
fxAdd_RawContact();
}
public void fxAdd_RawContact() {
//----------------< fxAdd_RawContact() >----------------
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContact_NewID= ops.size();
//----< add new blank Contact >----
try {
ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
.withValue(RawContacts.ACCOUNT_TYPE, null)//accountType=null
.withValue(RawContacts.ACCOUNT_NAME, null) //accountName=null
.build());
}
catch(Exception e)
{
Log.e("Add","could not find account_type null");
return;
}
//----</ add new blank Contact >----
//----< get+init values >----
String sFirstname = String.valueOf(((EditText)findViewById(R.id.txtFirstname )).getText());;
String sLastname = String.valueOf(((EditText)findViewById(R.id.txtLastname)).getText());
String sDisplayName = sLastname + " " + sFirstname;
String sPhoneNr = String.valueOf(((EditText)findViewById(R.id.txtTelephone)).getText());
String sEmail = String.valueOf(((EditText)findViewById(R.id.txtEmail)).getText());
//----</ get+init values >----
//----< set values to new contact >----
//< Person >
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContact_NewID)// rawContact_NewID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, sDisplayName) // Name of the person
.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, sLastname)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, sFirstname)
.build());
//</ Person >
//< Email >
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContact_NewID)// rawContact_NewID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA, sEmail)
.build());
//</ Email >
//< Phone >
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContact_NewID)// rawContact_NewID)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, sPhoneNr)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME )
.build());
//</ Phone >
//----</ set values to new contact >----
//----< check result >----
//< get result >
ContentProviderResult[] res = new ContentProviderResult[0];
try {
res = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
//e.printStackTrace();
Log.e("getContentResolver()",e.getMessage());
} catch (OperationApplicationException e) {
//e.printStackTrace();
//Log.getStackTraceString(e)
Log.e("getContentResolver()",e.toString());
} catch (Exception e) {
//e.printStackTrace();
//Log.getStackTraceString(e)
Log.e("getContentResolver()",e.toString());
} finally {
//ok.. Log.d("getContentResolver.","..finally");
}
//</ get result >
//--< check result >--
if (res != null && res[0] != null) {
//< ok >
Uri newContactUri = res[0].uri;
Log.d("AddContact", "URI added contact:" + newContactUri);
//</ ok >
}
else {
//< error >
// Log.e("AddContact", "Contact not added.");
//</ error >
}
//--</ check result >--
//----</ check result >----
//----------------</ fxAdd_RawContact() >----------------
}
|
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="de.rue25.a2016_09_22_add_new_contactraw">
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
App Indexing. See https://g.co/AppIndexing/AndroidStudio for more information. -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"/>
</application>
</manifest>
|
Activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="de.rue25.a2016_09_22_add_new_contactraw.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="add RawContact"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add Contact"
android:id="@+id/btnAdd_Contact"
android:onClick="btnAdd_Contact_onClick"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="72dp"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:ems="10"
android:id="@+id/txtFirstname"
android:layout_marginTop="36dp"
android:layout_alignLeft="@+id/txtTelephone"
android:layout_alignStart="@+id/txtTelephone"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="phone"
android:ems="10"
android:id="@+id/txtTelephone"
android:layout_alignTop="@+id/lblTelephone"
android:layout_alignLeft="@+id/btnAdd_Contact"
android:layout_alignStart="@+id/btnAdd_Contact"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Firstname"
android:id="@+id/lblName"
android:layout_alignTop="@+id/txtFirstname"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Telephone"
android:id="@+id/lblTelephone"
android:layout_below="@+id/txtLastname"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Lastname"
android:id="@+id/lblLastname"
android:layout_below="@+id/txtFirstname"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="21dp"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textPersonName"
android:ems="10"
android:id="@+id/txtLastname"
android:layout_alignTop="@+id/lblLastname"
android:layout_alignLeft="@+id/txtTelephone"
android:layout_alignStart="@+id/txtTelephone"/>
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="textEmailAddress"
android:ems="10"
android:id="@+id/txtEmail"
android:layout_below="@+id/txtTelephone"
android:layout_alignLeft="@+id/txtTelephone"
android:layout_alignStart="@+id/txtTelephone"
android:layout_marginTop="24dp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Email:"
android:id="@+id/lblEmail"
android:layout_alignTop="@+id/txtEmail"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
</RelativeLayout>
|