MartinMojito MartinMojito - 5 months ago 93
Java Question

Permission denial when calling from Android fragment. Uses-permission IS set

I got a little problem here and it is driving me crazy.
I want to call a person with the ACTION_CALL intent in Android and I do it with the following code in a fragment:

Intent callIntent = new Intent(Intent.ACTION_CALL);
Ansat a = container.adapter.getItem(position);
callIntent.setData(Uri.parse("tel:" + a.mobil.replace(" ", "").trim()));
container.startActivity(callIntent);


container is the main activity context passed to the fragment, because fragments don't have its own activity.

I have set the permission in Android manifest:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.CALL_PHONE" />

<permission
android:name="mithfogvuc.android.svhfvuc.dk.app.permission.C2D_MESSAGE"
android:protectionLevel="signature" />

<uses-permission android:name="mithfogvuc.android.svhfvuc.dk.app.permission.C2D_MESSAGE" />

<uses-feature
android:name="android.hardware.camera"
android:required="true" />

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme.NoActionBar"
tools:replace="android:icon">
<activity
android:name=".SplashActivity"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:screenOrientation="portrait" />
<activity
android:name=".NewsActivity"
android:screenOrientation="portrait" />

<receiver
android:name="com.google.android.gms.gcm.GcmReceiver"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />

<category android:name="mithfogvuc.android.svhfvuc.dk.app" />
</intent-filter>
</receiver>

<service
android:name=".GCMPushReceiverService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name=".GCMRegistrationIntentService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.idd.InstanceID" />
</intent-filter>
</service>

<activity
android:name=".FravaersregistreringActivity"
android:screenOrientation="portrait" />
<activity
android:name=".FremmoederegistreringActivity"
android:screenOrientation="portrait"/>
</application>




WHY am I getting the following error:

FATAL EXCEPTION: main
Process: mithfogvuc.android.svhfvuc.dk, PID: 23045
java.lang.SecurityException: Permission Denial: starting Intent {
act=android.intent.action.CALL dat=tel:xxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity }
from ProcessRecord{6c1ee2e 23045:mithfogvuc.android.svhfvuc.dk/u0a251} (pid=23045, uid=10251) with revoked permission android.permission.CALL_PHONE

Answer

From Android 6.0 (Api lvl 23) onwards the OS allows users to revoke permissions from applications. You need to look into Runtime Permissions

It looks like your app needs to poll one of the requestPermissions() methods to be granted access to the call_phone API!