Kotlin Разрешения с Декстером go на настройки Диалог - PullRequest
1 голос
/ 23 апреля 2020

спасибо за проверку. Поэтому я работаю над проектом, который в конечном итоге будет расширяться / добавлять некоторые функции, и в настоящее время я работаю над запросом разрешений у Декстера (https://github.com/Karumi/Dexter). Я смог заставить его работать, и когда пользователь нажимает кнопку «Добавить изображение», он также запрашивает у пользователя разрешения, но я столкнулся с проблемой, которую сам, похоже, не могу решить. Таким образом, проблема заключается в том, что если пользователь впервые открывает приложение и нажимает кнопку «Добавить изображение», а затем выбирает Пользователь нажимает кнопку добавления изображения и выбирает первый параметр

И позволяет Предположим, что пользователь отказывает во всех разрешениях, если пользователь снова нажимает на кнопку, приложение снова запрашивает разрешения, но на этот раз с опцией «отказать и больше не спрашивать». И я построил небольшой диалог, который объясняет, почему нужны разрешения, и может привести пользователя к настройкам. Но я обнаружил, что если пользователь фактически разрешает разрешения для второго go, приложение все равно открывает это окно, и я просто не смог его решить. Пользователь разрешает разрешения Сообщение по-прежнему отображается, хотя пользователь предоставил разрешения

Вот мой код:

// Creating the variables of Calender Instance and DatePickerDialog listener to use it for date selection
// A variable to get an instance calendar using the default time zone and locale.
private var cal = Calendar.getInstance()

/* A variable for DatePickerDialog OnDateSetListener.
* The listener used to indicate the user has finished selecting a date. It will be initialized later. */
private lateinit var dateSetListener: DatePickerDialog.OnDateSetListener

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

    // Adds the back button on the ActionBar
    setSupportActionBar(toolbar_add_place)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    toolbar_add_place.setNavigationOnClickListener {
        onBackPressed()
    }

    // Initialize the DatePicker and sets the selected date
    // https://www.tutorialkart.com/kotlin-android/android-datepicker-kotlin-example/
    dateSetListener = DatePickerDialog.OnDateSetListener { _, year, month, dayOfMonth ->
        cal.set(Calendar.YEAR, year)
        cal.set(Calendar.MONTH, month)
        cal.set(Calendar.DAY_OF_MONTH, dayOfMonth)
        updateDateInView()
    }
    // Uses functionality in the onClick function below
    et_date.setOnClickListener(this)
    tv_add_image.setOnClickListener(this)
}

// This is a override method after extending the onclick listener interface (gets created automatically)
override fun onClick(v: View?) {
    when (v!!.id) {
        R.id.et_date -> {
            DatePickerDialog(
                this@AddHappyPlaceActivity, dateSetListener,
                cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)
            ).show()
        }
        R.id.tv_add_image -> {
            val pictureDialog = AlertDialog.Builder(this)
            pictureDialog.setTitle("Select Action")
            val pictureDialogItems =
                arrayOf("Select photo from gallery", "Capture photo from camera")
            pictureDialog.setItems(pictureDialogItems) { _, which ->
                when (which) {
                    0 -> choosePhotoFromGallery()
                    1 -> Toast.makeText(
                        this,
                        "Camera selection coming soon",
                        Toast.LENGTH_SHORT
                    ).show()
                }
            }
            pictureDialog.show()
        }
    }
}


// Method used for image selection from GALLERY/PHOTOS
private fun choosePhotoFromGallery() {
    // Asking for permissions using DEXTER Library
    Dexter.withContext(this).withPermissions(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE,
        Manifest.permission.CAMERA
    ).withListener(object : MultiplePermissionsListener {
        override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
            // Here after all the permission are granted, launch the gallery to select and image.
            if (report!!.areAllPermissionsGranted()) {
                Toast.makeText(
                    this@AddHappyPlaceActivity,
                    "Storage READ/WRITE permission are granted. Now you can select an image from GALLERY or lets says phone storage.",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }

        override fun onPermissionRationaleShouldBeShown(
            permissions: MutableList<PermissionRequest>?,
            token: PermissionToken?
        ) {
            token?.continuePermissionRequest()
            showRationalDialogForPermissions()

        }
    }).onSameThread().check()
}

// Message to be shown if user denies access and possibly send him to the settings
private fun showRationalDialogForPermissions() {
    AlertDialog.Builder(this).setMessage(
        "It looks like you have turned off " +
                "permissions required for this feature"
    ).setPositiveButton("GO TO SETTINGS")
    { _, _ ->
        try {
            val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
            val uri = Uri.fromParts("package", packageName, null)
            intent.data = uri
            startActivity(intent)
        } catch (e: ActivityNotFoundException) {
            e.printStackTrace()
        }
    }.setNegativeButton("Cancel") { dialog, _ ->
        dialog.dismiss()
    }.show()
}

// A function to update the selected date in the UI with selected format.
private fun updateDateInView() {
    val myFormat = "dd.MM.yyyy"
    val sdf = SimpleDateFormat(myFormat, Locale.getDefault())
    et_date.setText(sdf.format(cal.time).toString())
}

}

Как вы можете видеть, я говорю о функции «showRationalDialogForPermissions ()», которая инициализируется в функции «onPermissionRationaleShouldBeShown».

Если кто-то знает, как решить эту проблему, или у меня есть какие-либо советы, которые я мог бы дать go I был бы очень признателен.

С уважением,

РЕДАКТИРОВАТЬ: Кроме того, я понял, если пользователь нажимает «Отказаться и больше не спрашивать» и отменяет мой диалог, приложение, похоже, не сделать диалог появится после этого. Почти ничего не происходит.

1 Ответ

0 голосов
/ 23 апреля 2020

Итак, я попробовал несколько вещей и у меня все получилось (все еще есть fl aws)

Я изменил следующее:

            R.id.tv_add_image -> {
            val pictureDialog = AlertDialog.Builder(this)
            pictureDialog.setTitle("Select Action")
            val pictureDialogItems = arrayOf("Select photo from gallery", "Capture photo from camera")
            pictureDialog.setItems(pictureDialogItems) {
                    _, which ->
                when(which) {
                    0 -> choosePhotoFromGallery()
                    1 -> Toast.makeText(this, "Camera selection coming soon", Toast.LENGTH_SHORT).show()
                }
            }
            pictureDialog.show()
            addButtonClicked += 1
            if (addButtonClicked > 2) {
                if (ContextCompat.checkSelfPermission(this@AddHappyPlaceActivity,
                        Manifest.permission.CAMERA)
                        != PackageManager.PERMISSION_GRANTED) {
                        showRationalDialogForPermissions()
                    }
                if (ContextCompat.checkSelfPermission(this@AddHappyPlaceActivity,
                        Manifest.permission.READ_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                        showRationalDialogForPermissions()
                    }
                if (ContextCompat.checkSelfPermission(this@AddHappyPlaceActivity,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {
                        showRationalDialogForPermissions()
                    }
            }
        }

Это не оптимально Решение, но я просто увеличиваю значение, созданное мной, на 1, и как только оно достигает 3 (при условии, что пользователь каким-то образом сумел отрицать 2 раза подряд), оно открывает это окно. Fl aws будет то, что вам как-то придется нажимать кнопку отмены 2 раза после предоставления разрешений. Но это как-то работает и делает то, что я искал; если у кого-то есть какие-то другие идеи или способы улучшить это «решение», оно будет высоко оценено

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...