Beim ersten Start Rechte setzen

  • Antworten:4
Robbiani Renato
  • Forum-Beiträge: 650

18.12.2023, 20:39:08 via Website

Hallo zusammen

Google verweigert mir die Veröffentlichung meines neusten Releases. Wenn ich die App starte, dann prüfe ich, ob die Rechte gesetzt sind.

 if (pruefrechte()) {
            str_text = getString(R.string.lbl_recht_neu)
            Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
            //Code für die Initialisierung
        } else {
            str_text = getString(R.string.lbl_recht_fasch)
            Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
            finish()
        }

Wenn die Rechte nicht gesetzt sind, dann wird die App beendet. Soweit korrekt.
Nach einer neuen Installation startet die App zum ersten mal. Darum wird nach den nötigen Rechten gefragt. Auch wenn ich dem Erteilen der Rechte zustimme, wird die App beendet. Dies interpretiert Google als Absturz.

private fun pruefrechte(): Boolean {
    var result: Int
    val listPermissionsNeeded: MutableList<String> = ArrayList<String>()
    for (p in rechte) {
        result = ContextCompat.checkSelfPermission(this, p)
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add((p))
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, (listPermissionsNeeded.toTypedArray() as Array<String?>;), MULTIPLE_PERMISSIONS)
        // keine permissions gesetzt
        return false
    }
    // alle permissions gesetzt
    return true
}

Was kann ich an meinem Code ändern, dass wenn ich die App beim Ersten mal starten die Rechte erteile die App weiter läuft?

Gruss Renato

Kommentieren
Robbiani Renato
  • Forum-Beiträge: 650

18.12.2023, 21:30:01 via Website

Hallo zusammen

Ich habe da noch was vergessen.

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        MULTIPLE_PERMISSIONS -> {
            if (grantResults.size > 0) {
                var permissionsDenied = ""
                for (per in permissions) {
                    if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                        permissionsDenied += "\n" + per
                    }
                }
                // Nach dem ersten Male
            }
            return
        }
    }
}

Das gehört ebenfalls dazu.

Gruss Renato

Hilfreich?
Kommentieren
Jokel
  • Forum-Beiträge: 1.547

19.12.2023, 17:45:19 via Website

Was kann ich an meinem Code ändern, dass wenn ich die App beim Ersten mal starten die Rechte erteile die App weiter läuft?

Da solltest du in der onRequestPermissionsResult Methode das gleiche machen wie als wenn deine Prüf Methode True zurüch gibt.

Also statt einfach return jetzt hier deinen Proramm starten.

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 650

23.12.2023, 21:57:53 via Website

Ciao Jokel

Vielleicht kannst du mir weiter helfen. Ich habe mich mal im Internet umgeschaut und eine Lösung mit einem Launcher gefunden. Aber mit diesem Code werden die Rechte nicht mehr aufgerufen und die App einfach gestartet.

package ch.robbisoft.klassennotfall

import android.Manifest
import android.app.Activity
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.TextView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.widget.Toolbar
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.get
import androidx.preference.PreferenceManager
import androidx.viewpager2.widget.ViewPager2
import ch.robbisoft.klassennotfall.databinding.ActivityMainBinding
import com.google.android.material.tabs.TabLayout
import com.google.android.material.tabs.TabLayoutMediator

private val TAG = MainActivity::class.simpleName

class MainActivity : AppCompatActivity(), View.OnClickListener {

var rechte = arrayOf(
    Manifest.permission.WRITE_EXTERNAL_STORAGE,
    Manifest.permission.READ_EXTERNAL_STORAGE
)
private var str_text: String? = null

private lateinit var binding : ActivityMainBinding
private lateinit var tabs : TabLayout
private lateinit var page : ViewPager2
private lateinit var toolbar: Toolbar
private lateinit var ctx : Context
private lateinit var ac_ctx : Context
private lateinit var klassnama : String
private lateinit var klassnamb : String
private lateinit var klassnamc : String

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    val view = binding.root
    setContentView(view)

    ctx = applicationContext
    ac_ctx = this

    val prefs = PreferenceManager.getDefaultSharedPreferences(ac_ctx)
    if(!prefs.contains("key_eins")){
        val prefvalue = prefs.edit()
        klassnama = getString(R.string.lbl_tab_eins)
        klassnamb = getString(R.string.lbl_tab_zwei)
        klassnamc = getString(R.string.lbl_tab_drei)
        prefvalue.putString("key_eins", klassnama)
        prefvalue.putString("key_zwei", klassnamb)
        prefvalue.putString("key_drei", klassnamc)
        prefvalue.apply()
        prefvalue.commit()
    }else{
        klassnama = prefs.getString("key_eins", null).toString()
        klassnamb = prefs.getString("key_zwei", null).toString()
        klassnamc = prefs.getString("key_drei", null).toString()
    }


    val KlassArray = arrayOf<String>(
        klassnama,
        klassnamb,
        klassnamc
    )

    toolbar = binding.tobBar
    setSupportActionBar(toolbar)

    toolbar.inflateMenu(R.menu.menu_main)
    tabs = binding.tabLaytop
    page = binding.laySeite

    tabs.addTab(tabs.newTab().setText(klassnama))
    tabs.addTab(tabs.newTab().setText(klassnamb))
    tabs.addTab(tabs.newTab().setText(klassnamc))
    tabs.tabGravity = TabLayout.GRAVITY_FILL

    val adapter = MyAdapter(supportFragmentManager, lifecycle)
    adapter.counter = tabs.tabCount
    page.adapter = adapter

    TabLayoutMediator(tabs, page) { tab, position ->
        tab.text = KlassArray[position].toString()
    }.attach()

    tabs.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener{
        override fun onTabSelected(tab: TabLayout.Tab?) {
            if (tab != null) {
                page.currentItem = tab.position
            }
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {

        }

        override fun onTabReselected(tab: TabLayout.Tab?) {

        }

    })

    page.setOnClickListener {
        val objekt = it as TextView
        val text = objekt.text.toString()
        Log.d(TAG, text)
    }

    page.setOnContextClickListener(View.OnContextClickListener { v : View ->
        val objekt = v as TextView
        val text = objekt.text.toString()
        Log.d(TAG, text)
        return@OnContextClickListener true
    })

    //prüft ob OS Version > 6 ist, denn vorher kann nicht geprüft werden

// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { //prüfen ob Rechte vorhanden sind
// if (pruefrechte()) {
// str_text = getString(R.string.lbl_recht_neu)
// Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
// //Code für die Initialisierung
// } else {
// str_text = getString(R.string.lbl_recht_fasch)
// Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
// finish()
// }
// } else {
// str_text = getString(R.string.lbl_recht_alt)
// Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
// }

}

private val requestPermissionLauncher = registerForActivityResult(ActivityResultContracts.RequestPermission()){ isGranted : Boolean ->
    if(isGranted){
        str_text = getString(R.string.lbl_recht_neu)
        Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
    }else{
        str_text = getString(R.string.lbl_recht_fasch)
        Toast.makeText(ctx, str_text, Toast.LENGTH_SHORT).show()
    }
}

fun onClickRequestPermission( iew : View){
    var result : Int
    val listPermissionsNeeded : MutableList<String> = ArrayList<String>()
    for( p in rechte ){
        result = ContextCompat.checkSelfPermission(this, p)
        if(result != PackageManager.PERMISSION_GRANTED){
            listPermissionsNeeded.add(p)
        }
    }
    if( !listPermissionsNeeded.isEmpty() ){
        ActivityCompat.requestPermissions(this, (listPermissionsNeeded.toTypedArray() as Array<String?>;), MULTIPLE_PERMISSIONS)
    }
}

private fun pruefrechte(): Boolean {
    var result: Int
    val listPermissionsNeeded: MutableList<String> = ArrayList<String>()
    for (p in rechte) {
        result = ContextCompat.checkSelfPermission(this, p)
        if (result != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add((p))
        }
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, (listPermissionsNeeded.toTypedArray() as Array<String?>;), MULTIPLE_PERMISSIONS)
        // keine permissions gesetzt

        return false
    }
    // alle permissions gesetzt
    return true
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        MULTIPLE_PERMISSIONS -> {
            if (grantResults.size > 0) {
                var permissionsDenied = ""
                for (per in permissions) {
                    if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                        permissionsDenied += "\n" + per
                    }
                }
                // Nach dem ersten Male
            }
            return
        }
    }
}

companion object {
    const val MULTIPLE_PERMISSIONS = 99
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.menu_main, menu)
    return super.onCreateOptionsMenu(menu)
}

override fun onClick(v: View?) {
    var objekt = v as TextView
    var text = objekt.text.toString()
    Log.d(TAG, "->MainActivity " + text)
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    val was = item.itemId
    return when(was){

// R.id.mnu_add -> {
// val intent = Intent(ac_ctx, PersonIn::class.java)
// persinHorcher.launch(intent)
// return true
// }
// R.id.mnu_save -> {
// return true
// }
R.id.mnu_optionen -> {
val intent = Intent(ac_ctx, SettingsActivity::class.java)
OptionenHorcher.launch(intent)
return true
}
else -> super.onOptionsItemSelected(item)
}
}

var OptionenHorcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
    if(result.resultCode == Activity.RESULT_OK){
        val prefs = PreferenceManager.getDefaultSharedPreferences(ac_ctx)
        klassnama = prefs.getString("key_eins", null).toString()
        klassnamb = prefs.getString("key_zwei", null).toString()
        klassnamc = prefs.getString("key_drei", null).toString()
        var page : TabLayout.Tab
        page = tabs.getTabAt(0)!!
        page.setText(klassnama)
        page = tabs.getTabAt(1)!!
        page.setText(klassnamb)
        page = tabs.getTabAt(2)!!
        page.setText(klassnamc)
    }
}

//Person hinzufügen
var persinHorcher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()){ result ->
    if (result.resultCode == Activity.RESULT_OK){
        if (result.data != null){
            val data : Intent? = result.data
            var pers = Person()
            pers.pname = data!!.getStringExtra("name").toString()
            pers.telmutter = data.getStringExtra("mutter").toString()
            pers.telvater = data.getStringExtra("vater").toString()
            pers.telalg = data.getStringExtra("allg").toString()
        }
    }
}

override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
    return super.onPrepareOptionsMenu(menu)
}

}

Vielleicht sieht jemand wo das Problem ist. Ich komme auf jeden Fall nicht mehr weiter.

Gruss Renato

Hilfreich?
Kommentieren
Robbiani Renato
  • Forum-Beiträge: 650

25.12.2023, 17:47:01 via Website

Hallo zusammen

Ich habe im onCreate folgende Zeile eingefügt:

requestPermissionLauncher.launch(Manifest.permission.WRITE_EXTERNAL_STORAGE)

Danach werden die Rechte abgefragt.
Danke allen welche auf meine Frage geantwortet haben.

Gruss Renato

Hilfreich?
Kommentieren