Daten in Kontakte schreiben

  • Antworten:1
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 308

21.05.2020, 21:21:36 via Website

Hallo zusammen

Ich lerne zur Zeit Kotlin. Dazu verwende ich ein Buch mit Beispielen. In einem Programm komme ich nicht weiter. Das Programm soll den Namen, Telefonnummer und die E-Mail Adresse in die Kontakte schreiben. Aber das Beispiel läuft bei mir nicht.

package ch.robbisoft.sysstemkontakt

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*

import android.content.pm.PackageManager.PERMISSION_GRANTED
import android.Manifest
import android.support.v4.app.*

import android.content.Intent
import android.provider.ContactsContract.Contacts

import java.util.ArrayList
import android.content.ContentProviderOperation
import android.provider.ContactsContract.AUTHORITY
import android.provider.ContactsContract.Data
import android.provider.ContactsContract.RawContacts
import android.provider.ContactsContract.CommonDataKinds.Email
import android.provider.ContactsContract.CommonDataKinds.Phone
import android.provider.ContactsContract.CommonDataKinds.StructuredName

const val KONSTANTE_KONTAKT = 123

class MainActivity : AppCompatActivity(), ActivityCompat.OnRequestPermissionsResultCallback {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    if(ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS) != PERMISSION_GRANTED)
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.WRITE_CONTACTS), KONSTANTE_KONTAKT)

    buLesen.setOnClickListener {
        kontaktlisteAnzeigen()
    }

    buNeu.setOnClickListener {
        val cpoListe = ArrayList<ContentProviderOperation>()
        val kontaktId = 0
        var cpob = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)

        //Eintrag in Kontaktliste
        cpob.withValue(RawContacts.ACCOUNT_TYPE, null)
        cpob.withValue(RawContacts.ACCOUNT_NAME, null)
        var cpo = cpob.build()
        cpoListe.add(cpo)

        //Name
        cpob = ContentProviderOperation.newInsert(Data.CONTENT_URI)
        cpob.withValueBackReference(Data.RAW_CONTACT_ID, kontaktId)
        cpob.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
        cpob.withValue(StructuredName.DISPLAY_NAME, edName.text.toString())
        cpo = cpob.build()
        cpoListe.add(cpo)

        //Nummer
        cpob = ContentProviderOperation.newInsert(Data.CONTENT_URI)
        cpob.withValueBackReference(Data.NAME_RAW_CONTACT_ID, kontaktId)
        cpob.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
        cpob.withValue(Phone.NUMBER, edPhone.text.toString())
        cpob.withValue(Phone.TYPE, Phone.TYPE_MOBILE)
        cpo = cpob.build()
        cpoListe.add(cpo)

        //Mail
        cpob = ContentProviderOperation.newInsert(Data.CONTENT_URI)
        cpob.withValueBackReference(Data.RAW_CONTACT_ID, kontaktId)
        cpob.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE)
        cpob.withValue(Email.ADDRESS, edMail.text.toString())
        cpob.withValue(Email.TYPE, Email.TYPE_HOME)
        cpo = cpob.build()
        cpoListe.add(cpo)

        contentResolver.applyBatch(AUTHORITY, cpoListe)
        kontaktlisteAnzeigen()
    }
}

private fun kontaktlisteAnzeigen() {
    val kontakteActivity = Intent(Intent.ACTION_VIEW, ContactsContract.Contacts.CONTENT_URI)
    startActivity(kontakteActivity)
}

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray) {
    if (requestCode == KONSTANTE_KONTAKT && grantResults.isNotEmpty() && grantResults[0] != PERMISSION_GRANTED)
        finish()
}

}

Trotz dem Import will er das "AppCompatActivity()" aus

class MainActivity : AppCompatActivity(), ActivityCompat.OnRequestPermissionsResultCallback {

nicht erkennen. Weiter ist auch "ActivityCompat" rot unterlegt.
Im weiteren kann er den folgenden Import nicht machen

import android.support.v7.app.AppCompatActivity

Er will das "v7" nicht kennen.
Wenn ich alle imports mache damit es funktioniert, dann verabschiedet sich die app bei der folgenden Zeile:

contentResolver.applyBatch(AUTHORITY, cpoListe)

mit einer nullpointer exeption.
Die Build.gradle habe ich auch schon verglichen. An dem sollte es nicht liegen. Wo kann ich noch nach Fehlern suchen?

Gruss Renato

Diskutiere mit!
Beste Antwort
  • Forum-Beiträge: 308

21.05.2020, 21:39:15 via Website

Entschuldige! Aber ich habe den Fehler gefunden. Die Zeile unter Nummer

cpob.withValueBackReference(Data.NAME_RAW_CONTACT_ID, kontaktId)

ist falsch. Besser lautet es so.

cpob.withValueBackReference(Data.RAW_CONTACT_ID, kontaktId)

Genau so und nun funktioniert es auch ohne Absturz. Die Fehlermeldung hat mich auf eine falsche Fährte geführt.

Gruss Renato

Hilfreich?
Diskutiere mit!
Empfohlene Artikel bei NextPit