web-dev-qa-db-ja.com

ブロードキャストレシーバーでのアクセス拒否

発信時にログメッセージを入力するアプリを作成しようとしています。

ただし、コードを実行すると、アクセス許可を入力したにもかかわらず、アクセス許可が拒否されます。

拒否ログ:

"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)
12
walker_4

私はこのリンクを密接にたどることによってそれを機能させました 発信通話を傍受-私は何が欠けていますか? (ありがとう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>
2
walker_4

私は同じアプリケーションをAndroidエミュレータで起動しましたが、何の助けにもなりませんでした。

Android:enabled="true"
Android:exported="true"

解決策は、[設定]-> [アプリ]-> [MyApplication]-> [権限]-> [電話の権限をオンにする]に移動することでした。

アプリケーションのAndroidスマートフォン権限

最善の解決策は、コードを実行してUSBデバッグをアクティブにするときです。開発者設定で、パーミッションモニター設定を無効にするように選択してください。アプリはOSによる許可を求められなくなります。幸せな支援:)

これはマニフェストで何も変更せずに機能します!

0

コードがAndroid 6.0以上で実行されている場合、コードにランタイム権限を適用する必要があります。

0
ThomsonStan

マニフェストレシーバーに次のものを追加する必要があります

 <service Android:name=".CallReceiver"
            Android:enabled="true"
            Android:exported="false" >
        </service>
0
Somasundaram NP

使用許可CALL_PHONEの代わりにOUTGOING

<uses-permission Android:name="Android.permission.CALL_PHONE" />

<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
0
koutuk