フリーランス 技術調査ブログ

フリーランス/エンジニア Ruby Python Nodejs Vuejs React Dockerなどの調査技術調査の備忘録

android スプラッシュからの携帯電話情報の取得

はじめに

  • androidでスプラッシュ画面から遷移して携帯電話情報を取得して画面表示するサンプルを作ってみた

manifestファイル

  • 携帯電話情報を取得するために下記のXMLを記述する
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />

app\build.gradleファイル

  • コルーチンを利用するためにkotlinxをインポートする。スプラッシュからトップ画面に遷移するために利用する
plugins {
    id 'com.android.application'
    id 'kotlin-android'
    //以下1行追加
    id 'kotlin-android-extensions'
}

dependencies {
   (省略)
   implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.1'
}

スプラッシュ画面

  • スプラッシュのactivityのコード。2秒後にトップ画面に遷移する
class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        val ivSplash = findViewById<ImageView>(R.id.ivSplash)
        val assets = resources.assets
        try {
            assets.open("splash.jpg").use { istream ->
                val bitmap = BitmapFactory.decodeStream(istream)
                ivSplash.setImageBitmap(bitmap)
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
        CoroutineScope(Dispatchers.Main).launch {
            delay(2000)
            val intent = Intent(this@SplashActivity, MainActivity::class.java)
            startActivity(intent)
            finish()
        }

    }
    
}

f:id:PX-WING:20210716080356p:plain

トップ画面

  • 携帯電話情報の権限を確認して許可を得たら携帯電話番号を表示する処理をする
  • アンドロイドのバージョンによって携帯電話番号取得の権限が異なるのでバージョンごとに権限の値を切り替え。 Build.VERSION.SDK_INTを利用してバージョンを切り替える
private const val REQUEST_PHONE_PERMISSION = 200

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        getPhoneNumber()
        var wevview = findViewById<WebView>(R.id.topWebview)
        wevview.loadUrl("https://www.google.co.jp/")
    }

    private fun permissionPhoneCheck(): Boolean {
        // ToDo: https://developer.android.com/about/versions/11/privacy/permissions?hl=ja
        var phonePermission: String = Manifest.permission.READ_PHONE_STATE
        if(Build.VERSION.SDK_INT >= 30){
            phonePermission = Manifest.permission.READ_PHONE_NUMBERS
        }
        var permissions: Array<String> = arrayOf(phonePermission)
        // 権限のチェック
        if (ActivityCompat.checkSelfPermission(this@MainActivity,
                phonePermission) != PackageManager.PERMISSION_GRANTED) {
            // 権限がないため、権限のリクエスト
            ActivityCompat.requestPermissions(this@MainActivity,
                permissions, REQUEST_PHONE_PERMISSION)
            return false
        }
        return true
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String?>,
                                            grantResults: IntArray) {
        when (requestCode) {
            REQUEST_PHONE_PERMISSION -> {
                if (grantResults.isNotEmpty() && grantResults[0] ==
                    PackageManager.PERMISSION_GRANTED) {
                    getPhoneNumber()
                    Toast.makeText(this, "電話の発信と管理の許可を設定しました", Toast.LENGTH_SHORT).show()
                } else {
                    Toast.makeText(this, "電話の発信と管理の許可がありません.", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }

    private fun getPhoneNumber(): String {
        val telnumber = findViewById<TextView>(R.id.txTelnumber)
        if (permissionPhoneCheck()) {
            val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
            telnumber.text = telephonyManager.getLine1Number().toString()
            return telephonyManager.getLine1Number().toString()
        } else {
            telnumber.text = "(電話番号は取得できませんでした)"
            return "(電話番号は取得できませんでした)"
        }
    }

    fun onButtonClick(view: View) {
        var phoneNumberTxt: String = getPhoneNumber()
        val dialog = AlertDialog.Builder(this)
            .setTitle("あなたの携帯電話番号は")
            .setMessage(phoneNumberTxt)
            .setPositiveButton("OK") { dialog, which ->
                Toast.makeText(this, "OKがタップされた", Toast.LENGTH_SHORT).show()
            }
            .create()
        dialog.show()
    }

}

f:id:PX-WING:20210716080418p:plain

f:id:PX-WING:20210716080522p:plain