skip to Main Content

Below is the MainActivity code from which the problem is arising from.


class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener,
    AdapterView.OnItemSelectedListener {

    private var user: FirebaseUser? = null
    var activity: MainActivity? = null
    private var mUserRef: DatabaseReference? = null
    private lateinit var dialog: AlertDialog
    lateinit var bottomSheet: BottomSheetLayout
    lateinit var cView: View
    lateinit var tView: View


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R. id.toolbar)
        setSupportActionBar(toolbar)

        
        activity = this@MainActivity
        user = Firebase.auth.currentUser
        dialog = SpotsDialog.Builder().setContext(this).build()
        dialog.show()

        val network = Network(this)
        val imei = network.imei
        val imsi = network.imsi
        Log.e("deviceInfo", "$imei $imsi")

        if (user != null) {
            Log.d("UserData", user!!.metadata!!.lastSignInTimestamp.toString())
            // User is signed in
            user.let {


                val db = Firebase.firestore
                mUserRef = FirebaseDatabase.getInstance().reference.child("users")
                    .child(user!!.uid)

                val docRef = db.collection("users").document(user!!.uid)
                docRef.get()
                    .addOnSuccessListener { document ->
                        if (document != null) {
                            Log.d("MainActivity", "DocumentSnapshot data: ${document.data}")

                            name.text ="Name: "+ document.data!!["displayName"].toString()
                            mobile.text = "Phone number: "+ document.data!!["phoneNumber"].toString()
                            email.text = "Email: "+ document.data!!["email"].toString()
                                Glide.with(this)
                                .load(document.data!!["image"].toString())
                                .into(profile_image)
                            dialog.dismiss()
                            when {
                                document.data!!["clientTypeId"].toString() == "1" -> {
                                    svc.text = "Svc No.: ${document.data!!["militarySvc"].toString()}"
                                }
                                document.data!!["clientTypeId"].toString() == "2" -> {
                                    svc.text = "Job ID: ${document.data!!["jobId"].toString()}"
                                }
                                document.data!!["clientTypeId"].toString() == "3" -> {
                                    svc.text = "Employee No.: ${document.data!!["employeeNumber"].toString()}"
                                }
                            }

                        } else {
                            Log.d("MainActivity", "No such document")
                        }
                    }
                    .addOnFailureListener { exception ->
                        Log.d("MainActivity", "get failed with ", exception)
                    }

                val uid = user!!.uid
            }
        } else {
            startActivity(Intent(this, LoginActivity::class.java))
            finish()
        }

        val toggle = ActionBarDrawerToggle(
            this, drawer_layout,
            toolbar,
            R.string.navigation_drawer_open,
            R.string.navigation_drawer_close
        )
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()
        bottomSheet = findViewById<View>(R.id.bottomsheet) as BottomSheetLayout


        nav_view.setNavigationItemSelectedListener(this)

        requestLoan.setOnClickListener {
            startActivity(Intent(this,RequestLoanActivity::class.java))
        }
        insurance.setOnClickListener {
            bottomSheet.showWithSheetView(
                LayoutInflater.from(this@MainActivity)
                    .inflate(R.layout.insurance_sheet, bottomSheet, false)
            )
            val nextPage = bottomSheet.findViewById<Button>(R.id.next)
            nextPage.setOnClickListener {
                startActivity(Intent(this, AddInsuranceActivity::class.java))


            }
        }

        buyTokens.setOnClickListener {


            val dialog = MaterialDialog(this).customView(R.layout.kplc_token, scrollable = true)
            dialog.cornerRadius(16f)

            val customView = dialog.getCustomView()

            tView = customView

            buytoken(customView)

            dialog.show()
            
        }
        
        repayLoan.setOnClickListener {
            startActivity(Intent(this, RepayLoanActivity::class.java))

        }

        kopaless.setOnClickListener {
            startActivity(Intent(this, KopalessActivity::class.java))

        }

        buyAirtime.setOnClickListener {

            val dialog = MaterialDialog(this).customView(R.layout.airtime_sheet, scrollable = true)
            dialog.cornerRadius(16f)

            val customView = dialog.getCustomView()

            cView = customView
            
            buyairtim(customView)

            dialog.show()
        }

    }

 }

I’m getting a FATAL EXCEPTION due to Read Phone State permission not being granted at

val network = Network(this)

even after listing the necessary permissions in the manifest. Kindly let me know how I can fix that.

04-25 08:26:55.346 E/AndroidRuntime(15754): FATAL EXCEPTION: main
04-25 08:26:55.346 E/AndroidRuntime(15754): FATAL EXCEPTION: main
04-25 08:26:55.346 E/AndroidRuntime(15754): Process: com.lkmicrocredit.app, PID: 15754
04-25 08:26:55.346 E/AndroidRuntime(15754): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lkmicrocredit.app/com.lkmicrocredit.app.ui.activity.home.MainActivity}: java.lang.RuntimeException: Read Phone State permission not granted!
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3792)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.os.Handler.dispatchMessage(Handler.java:106)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.os.Looper.loop(Looper.java:246)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at android.app.ActivityThread.main(ActivityThread.java:8512)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at java.lang.reflect.Method.invoke(Native Method)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
04-25 08:26:55.346 E/AndroidRuntime(15754): Caused by: java.lang.RuntimeException: Read Phone State permission not granted!
04-25 08:26:55.346 E/AndroidRuntime(15754):     at com.an.deviceinfo.device.DeviceInfo.getIMEI(DeviceInfo.java:614)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at com.an.deviceinfo.device.model.Network.<init>(Network.java:26)
04-25 08:26:55.346 E/AndroidRuntime(15754):     at com.lkmicrocredit.app.ui.activity.home.MainActivity.onCreate(MainActivity.kt:79)


and the manifest …

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.lkmicrocredit.app">

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
        tools:remove="android:maxSdkVersion"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    
</manifest>

2

Answers


  1. Chosen as BEST ANSWER

    This works too.

    private val requestPermission =
    
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
            // Do something if permission granted
            if (isGranted) {
                Log.i("DEBUG", "permission granted")
            } else {
                Log.i("DEBUG", "permission denied")
            }
        }
    
    override fun onCreate(savedInstanceState: Bundle?) {
                    super.onCreate(savedInstanceState)
                    setContentView(R.layout.activity_main)
             
    
                    requestPermission.launch(Manifest.permission.READ_PHONE_STATE)
    
        }
    
    
    

  2. Something like this should work:

    val requestPermissionLauncher = registerForActivityResult(RequestPermission()) { isGranted: Boolean ->
        if (isGranted) {
            // Permission granted. App continues with permission
        } else {
            // Explain why the permission is needed to the user
        }
    }
    
    when {
      ContextCompat.checkSelfPermission(CONTEXT, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED -> {
        // Use the permission!
      }
      shouldShowRequestPermissionRationale(...) -> {
          showInContextUI(...)
      }
      else -> {
          requestPermissionLauncher.launch(Manifest.permission.READ_PHONE_STATE)
      }
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search