Я до сих пор не понимаю, почему я получаю ошибку: с намерением - PullRequest
0 голосов
/ 09 июня 2019

Почему я получаю сообщение об ошибке?Я хочу позвонить по номеру при нажатии на плавающую кнопку.

ContextCompat.startActivity (намерение), здесь выдается ошибка (намерение)

Несоответствие типов.Требуется: Найден контекст: Намерение

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

    fab.setOnClickListener { view ->
        Snackbar.make(view, "Secretariaat wordt gebeld", 
Snackbar.LENGTH_LONG)
            .setAction("Action", null).show()
        makePhoneCall("0123456")
    }

    val toggle = ActionBarDrawerToggle(
        this, drawer_layout, toolbar, R.string.navigation_drawer_open, 
R.string.navigation_drawer_close
    )
    drawer_layout.addDrawerListener(toggle)
    toggle.syncState()

    nav_view.setNavigationItemSelectedListener(this)
   }





fun makePhoneCall(number: String) : Boolean {
    try {
        val intent = Intent(Intent.ACTION_CALL)
        intent.setData(Uri.parse("tel:$number"))
        ContextCompat.startActivity(intent)
        return true
    } catch (e: Exception) {
        e.printStackTrace()
        return false
    }
}

Ответы [ 3 ]

1 голос
/ 09 июня 2019

Это потому, что ContextCompat.startActivity принимает три аргумента, Context, Intent и Bundle в качестве дополнительных параметров (может быть нулевым)

ContextCompat.startActivity(this, intent, null)
0 голосов
/ 09 июня 2019
  1. Нет необходимости использовать статический ContextCompat.startActivity(intent) использовать только startActivity(intent), поскольку вы уже находитесь в действии
  2. Для использования Intent.ACTION_CALL вам необходимо разрешение на вызов в манифесте.

<uses-permission android:name="android.permission.CALL_PHONE"/>

Есть другое решение, которое я предпочитаю.Используйте Intent.ACTION_DIAL вместо Intent.ACTION_CALL, который не требует разрешения.

Ваш код будет:

fun makePhoneCall(number: String) : Boolean {
    try {
        val intent = Intent(Intent.ACTION_DIAL)
        intent.setData(Uri.parse("tel:$number"))
        startActivity(intent)
        return true
    } catch (e: Exception) {
        e.printStackTrace()
        return false
    }
}

Подробнее

0 голосов
/ 09 июня 2019

Если вам нужно вызвать метод startActivity(), вы можете сделать это без ContextCompat класса. Если вы вызываете этот метод внутри Activity класса. В этом случае ваш код будет выглядеть так:

fun makePhoneCall(number: String) : Boolean {
    try {
        val intent = Intent(Intent.ACTION_CALL)
        intent.setData(Uri.parse("tel:$number"))
        startActivity(intent)
        return true
    } catch (e: Exception) {
        e.printStackTrace()
        return false
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...