発信時にログメッセージを入力するアプリを作成しようとしています。
ただし、コードを実行すると、アクセス許可を入力したにもかかわらず、アクセス許可が拒否されます。
拒否ログ:
"09-04 02:35:50.535 1294-1666 /?W/BroadcastQueue:権限の拒否:Intent {act = Android.intent.action.NEW_OUTGOING_CALL flg = 0x10000010(extrasがある)}をsamples.varma.packagecom.testreceive2 /に受信する.CallReceiverには、送信者によるAndroid.permission.PROCESS_OUTGOING_CALLSが必要ですAndroid(uid 1000) "
マニフェストコード:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="samples.varma.packagecom.testreceive2" >
Android:versionCode="1"
Android:versionName="1.0">
<uses-sdk
Android:minSdkVersion="14"
Android:targetSdkVersion="23" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE"/>
<uses-permission Android:name="Android.permission.PROCESS_OUTGOING_CALLS"/>
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name=".MainActivity"
Android:enabled="true"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
Android:name=".CallReceiver">
<intent-filter>
<action Android:name="Android.intent.action.PHONE_STATE"/>
<action Android:name="Android.intent.action.NEW_OUTGOING_CALL"/>
</intent-filter>
</receiver>
</application>
</manifest>
そしてこれが私のレシーバーのコードです:
package samples.varma.packagecom.testreceive2;
import Android.content.BroadcastReceiver;
import Android.content.Context;
import Android.content.Intent;
import Android.telephony.TelephonyManager;
import Android.util.Log;
public class CallReceiver extends BroadcastReceiver {
public CallReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state == null) {
String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i("TAG", "Outgoing Number: " + number);
} else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
Log.i("TAG", "Incoming Number: " + number);
}
}
}
私はこれに非常に慣れていないため、いくつかのエラーが発生したり、完全にずれている可能性があります。いずれにせよ、私はどんなガイダンスにも感謝します。なぜ私がこの拒否を受けているのか誰か知っていますか?
ありがとう
編集:
また、電話状態のアクセス許可を追加したにもかかわらず、これらのアクセス許可の拒否が発生しています。
特権電話状態許可はシステム許可であるため、追加できません。
09-04 04:36:03.249 1294-1440/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=Android.intent.action.PHONE_STATE flg=0x10 (has extras) } to samples.varma.packagecom.testreceive2/.CallReceiver requires Android.permission.READ_PRIVILEGED_PHONE_STATE due to sender Android (uid 1000)
09-04 04:36:03.271 1294-1308/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=Android.intent.action.PHONE_STATE flg=0x10 (has extras) } to samples.varma.packagecom.testreceive2/.CallReceiver requires Android.permission.READ_PHONE_STATE due to sender Android (uid 1000)
1294-1308/? W/BroadcastQueue﹕ Permission Denial: receiving Intent { act=Android.intent.action.PHONE_STATE flg=0x10 (has extras) } to samples.varma.packagecom.testreceive2/.CallReceiver requires Android.permission.READ_PHONE_STATE due to sender Android (uid 1000)
私はこのリンクを密接にたどることによってそれを機能させました 発信通話を傍受-私は何が欠けていますか? (ありがとうajit)
PHONE_STATE
権限、追加Android:enabled="true"
およびAndroid:exported="true"
をマニフェストの受信者に送信し、NEW_OUTGOING_CALL
以下のアプリケーションへのアクセス許可(これが必要かどうかは不明)。意図したSDKバージョンを削除し、基本的にリンクからレシーバーをコピーします。
レシーバータグからマニフェストタグに更新されたマニフェストコードは次のとおりです。
<receiver
Android:name=".testreceive3"
Android:enabled="true"
Android:exported="true" >
<intent-filter>
<action Android:name="Android.intent.action.NEW_OUTGOING_CALL"/>-->
</intent-filter>
</receiver>
</application>
<uses-permission Android:name="Android.permission.PROCESS_OUTGOING_CALLS" />>-->
</manifest>
私は同じアプリケーションをAndroidエミュレータで起動しましたが、何の助けにもなりませんでした。
Android:enabled="true"
Android:exported="true"
解決策は、[設定]-> [アプリ]-> [MyApplication]-> [権限]-> [電話の権限をオンにする]に移動することでした。
最善の解決策は、コードを実行してUSBデバッグをアクティブにするときです。開発者設定で、パーミッションモニター設定を無効にするように選択してください。アプリはOSによる許可を求められなくなります。幸せな支援:)
これはマニフェストで何も変更せずに機能します!
コードがAndroid 6.0以上で実行されている場合、コードにランタイム権限を適用する必要があります。
マニフェストレシーバーに次のものを追加する必要があります
<service Android:name=".CallReceiver"
Android:enabled="true"
Android:exported="false" >
</service>
使用許可CALL_PHONE
の代わりにOUTGOING
<uses-permission Android:name="Android.permission.CALL_PHONE" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />