Android StudioでKotlinを使用して電話を発信するには、以下の手順でコードを書きます。
-
マニフェストにパーミッションを追加する
-
電話発信のIntentを作成する
-
権限のリクエストと発信処理を行う
まず、AndroidManifest.xmlに電話発信のパーミッションを追加します。
<uses-permission android:name="android.permission.CALL_PHONE" />
次に、実際に電話を発信するコードを書きます。以下の例では、ボタンをクリックしたときに電話発信を行うようにしています。
また、Android 6.0 (API レベル 23) 以上では、危険なパーミッションは実行時にリクエストする必要があります。
以下は、Activityのコード例です。
import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private val phoneNumber = "1234567890" // 発信したい電話番号 private val callPermissionRequestCode = 101 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val callButton = findViewById<Button>(R.id.callButton) callButton.setOnClickListener { if (checkCallPermission()) { makePhoneCall() } else { requestCallPermission() } } } private fun checkCallPermission(): Boolean { return ContextCompat.checkSelfPermission(this, android.Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED } private fun requestCallPermission() { ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE), callPermissionRequestCode) } private fun makePhoneCall() { val intent = Intent(Intent.ACTION_CALL).apply { data = Uri.parse("tel:$phoneNumber") } try { startActivity(intent) } catch (e: Exception) { Toast.makeText(this, "発信に失敗しました: ${e.message}", Toast.LENGTH_SHORT).show() } } override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == callPermissionRequestCode) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { makePhoneCall() } else { Toast.makeText(this, "パーミッションが拒否されたため、電話を発信できません。", Toast.LENGTH_SHORT).show() } } } }
レイアウトファイル(activity_main.xml)には、ボタンを追加します。
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <Button android:id="@+id/callButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="電話を発信" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
注意点:
-
電話番号は、国コードなどを含む適切な形式で指定してください。
-
実行時パーミッションのリクエストは、ユーザーに説明が必要な場合があります。必要に応じて、パーミッションを要求する前に説明を表示する処理を追加してください。
また、Intent.ACTION_CALLは即時発信を行うため、パーミッションが必須です。ダイヤラーを起動するだけのIntent.ACTION_DIALを使用する場合は、パーミッションは不要ですが、ユーザーが実際に発信ボタンを押す必要があります。
ACTION_DIALの使用例:
val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } startActivity(intent)
ご希望の動作に応じて使い分けてください。
Android StudioでKotlinを使用して電話発信機能を実装する方法を説明します。以下の手順で進めてください。
1. パーミッションの追加
まずAndroidManifest.xml
に電話発信のパーミッションを追加します:
<uses-permission android:name="android.permission.CALL_PHONE" />
2. 電話発信機能の実装
メインアクティビティで実行時パーミッションのリクエストと発信処理を実装します:
import android.content.Intent import android.content.pm.PackageManager import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button import android.widget.Toast import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat class MainActivity : AppCompatActivity() { private val callPermissionCode = 101 private val phoneNumber = "0123456789" // 発信したい電話番号 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val callButton = findViewById<Button>(R.id.callButton) callButton.setOnClickListener { if (checkCallPermission()) { makePhoneCall() } else { requestCallPermission() } } } private fun checkCallPermission(): Boolean { return ContextCompat.checkSelfPermission( this, android.Manifest.permission.CALL_PHONE ) == PackageManager.PERMISSION_GRANTED } private fun requestCallPermission() { ActivityCompat.requestPermissions( this, arrayOf(android.Manifest.permission.CALL_PHONE), callPermissionCode ) } private fun makePhoneCall() { val intent = Intent(Intent.ACTION_CALL).apply { data = Uri.parse("tel:$phoneNumber") } try { startActivity(intent) } catch (e: Exception) { Toast.makeText(this, "発信に失敗しました: ${e.message}", Toast.LENGTH_SHORT).show() } } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == callPermissionCode) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { makePhoneCall() } else { Toast.makeText(this, "パーミッションが拒否されました", Toast.LENGTH_SHORT).show() } } } }
3. レイアウトファイルの例
activity_main.xml
に発信ボタンを追加:
<Button
android:id="@+id/callButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="電話を発信"
android:layout_centerInParent="true"/>
4. 注意点
-
危険なパーミッション:Android 6.0(API 23)以上では実行時パーミッションのリクエストが必要
-
電話番号の形式:国際形式(+81から始める)など端末の設定に合わせた形式を使用
-
例外処理:セキュリティ例外やActivityNotFound例外をキャッチする
5. 代替案:ダイヤラー起動
直接発信せずにダイヤラーを起動する方法(パーミッション不要):
private fun openDialer() { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } startActivity(intent) }
この実装で:
-
ボタンタップ時にパーミッション確認
-
許可されれば即時発信
-
拒否された場合はToastで通知
-
例外発生時もToastで通知
が行えます。実際の運用時には電話番号のバリデーションやエラーハンドリングをより詳細に実装してください。