Search code examples
androidkotlinandroid-activityandroid-manifestcalllog

App does not display the call log after allowing android.permission.READ_CALL_LOG once


// READ_CALL_LOG permission works only once after first installation of the app. when I install it again from android studio the permission does not appear and the app does not read the call logs. This also happens after installing the app and closing it. after opening it again, the call logs disappeared. I also call this activity from another login activity

// My AndroidManifest

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.calllog">
    
        <uses-permission android:name="android.permission.READ_CALL_LOG" />
        <uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/img"
            android:label="@string/app_name"
            android:roundIcon="@drawable/img"
            android:supportsRtl="true"
            android:theme="@style/Theme.CallLog"
            android:usesCleartextTraffic="true">
            <activity
                android:name=".HomeActivity"
                android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            </activity>
            <activity
                android:name=".MainActivity2"
                android:exported="false" />
            <activity
                android:name=".MainActivity"
                android:exported="false">
    
            </activity>
    
         </application>
    
    </manifest>
   

//My MainActivity

   //MainActivity

class MainActivity : AppCompatActivity() {

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


        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_CALL_LOG), 101)
            displayLog()
        }

    }

    private fun displayLog() {
        var cols= arrayOf(CallLog.Calls._ID, CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DURATION,CallLog.Calls.DATE)
        var rs=contentResolver.query(CallLog.Calls.CONTENT_URI,cols,null,null, "${CallLog.Calls.LAST_MODIFIED} DESC")
        var from= arrayOf(CallLog.Calls.NUMBER,CallLog.Calls.DURATION,CallLog.Calls.TYPE)
        val adapter=SimpleCursorAdapter(this, R.layout.mylayout,rs,from, intArrayOf(R.id.textView1,R.id.textView2,R.id.textView3),0)
        val listview=findViewById<ListView>(R.id.listview) as ListView
        listview.adapter=adapter
    }



    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        if(requestCode==101 && grantResults[0]==PackageManager.PERMISSION_GRANTED) {
            displayLog()
        }
    }
}

Solution

  • Change your if block to this , you are not handling the case when permission is already given.

     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
         ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.READ_CALL_LOG), 101)
                            
         }else{
          displayLog()
           }