2017-11-15 38 views
0

私はAppCompatActivityのアクティビティを持っています。このアクティビティを実行するには、アプリにACCESS_COARSE_LOCATIONWRITE_EXTERNAL_STORAGE権限を許可する必要があります。 Android Studio 3.0にアップデートするまで、すべてうまくいきました。requestPermissionsのプロンプトが表示されない

さて、WRITE_EXTERNAL_STORAGE許可を要求するためのプロンプトが表示されていない、と機能

public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] grantResults) 

が戻っている-1 grantResultsでさえも尋ねず。

許可が必要な場合はACCESS_COARSE_LOCATIONというアクセス許可を要求すると、この現象は起こりません。以下は、両方のチェックを呼び出すコード:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

      if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("This app needs location access"); 
       builder.setMessage("Please grant location access so this app can detect beacons."); 
       builder.setPositiveButton(android.R.string.ok, null); 
       builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
        public void onDismiss(DialogInterface dialog) { 
         requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); 
        } 
       }); 

       builder.show(); 
      } 
     } 

そして、他:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      final int PERMISSION_REQUEST_COARSE_LOCATION = 1; 

      if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
       final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
       builder.setTitle("This app needs sd access"); 
       builder.setMessage("Please grant sd access so this app can save files."); 
       builder.setPositiveButton(android.R.string.ok, null); 
       builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
        public void onDismiss(DialogInterface dialog) { 
         requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); 
        } 
       }); 

       builder.show(); 
      } 
     } 

が私のマニフェストに対応するセクションは次のようになります。

<uses-permission android:name="android.permission.BLUETOOTH" /> 
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

私は多くのことを読みました、しかし、これは非常に奇妙なものです。何らかのタイプのパーミッションがリクエストダイアログを表示していて、他のものはそうではありません。 ところで、デバイスにはSDカードがありません(常に内部ストレージを使用しています)が、これは問題ではありませんでした。

どちらも私のtargetSdkVersioncompileSdkVersionも正常に動作している26

EDIT

他の関連する権限などREAD_EXTERNAL_STORAGE、です。これは単なる書き込み許可の問題です。事前に

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_device_discovery); 

    context = this; 
    wm = (WifiManager) context.getApplicationContext().getSystemService(WIFI_SERVICE); 
    intent = getIntent(); 

    if(intent.getBooleanExtra("LOCAL_NETWORK", true) == true){ 
     ipAddress = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); 
     port = DEFAULT_LIGHT_PORT; 
    } 
    else{ 
     ipAddress = intent.getStringExtra("TRACK_IP"); 
     port = intent.getIntExtra("TRACK_PORT", DEFAULT_GATEWAY_PORT); 
    } 

    font = Typeface.createFromAsset(MainActivity.mainActivity.getAssets(), "RepRg.ttf"); 
    mHandler = new Handler(); 

    deviceArrayList = new ArrayList<>(); 
    devicesBufferList = new ArrayList<>(); 

    lightListAdapter = new LightListAdapter(this, deviceArrayList, intent); 

    discoveredListView = (ListView) findViewById(R.id.paired_devices); 
    discoveredListView.setAdapter(lightListAdapter); 

    listAllCheckBox = (CheckBox) findViewById(R.id.listAllCheckBox); 
    refreshButton = (ImageButton) findViewById(R.id.refreshButton); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

     if (this.checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { 
      final AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("This app needs sd access"); 
      builder.setMessage("Please grant sd access so this app can save files."); 
      builder.setPositiveButton(android.R.string.ok, null); 
      builder.setOnDismissListener(new DialogInterface.OnDismissListener() { 
       public void onDismiss(DialogInterface dialog) { 
        requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); 
       } 
      }); 

      builder.show(); 
     } 
    } 


    listAllCheckBox.setTypeface(font); 
    listAllCheckBox.setTextSize(18); 
    listAllCheckBox.setTextColor(Color.parseColor("#202020")); 
    listAllCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
      lightListAdapter.clear(); 
      processDeviceListing(); 
     } 
    }); 

    refreshButton.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        refreshButton.setImageResource(R.drawable.refresh_down); 
        break; 
       case MotionEvent.ACTION_UP: 
        refreshButton.setImageResource(R.drawable.refresh_up); 
        refreshDevicesList(); 
        break; 
       case MotionEvent.ACTION_CANCEL: 
        refreshButton.setImageResource(R.drawable.refresh_up); 
        break; 
      } 
      return false; 
     } 
    }); 

} 

ありがとう: は2つのAndroidデバイスやエミュレータ

コンプリートのonCreateメソッドでテスト。

答えて

1

この問題は、新しいバージョンのHockeyAppが原因であることが判明しました。 HockeySDKは私のアプリケーションに統合されています。今、バージョン5.0以来。0、ドキュメントは言う:

は、Android Oのための準備ができて、HockeySDK-のAndroidは今maxSdkVersionフィルタ付き WRITE_EXTERNAL_STORAGE権限を制限します。 では、いくつかの使用例があります。アプリケーションに のこのアクセス許可が必要な依存関係が含まれている場合、maxSdkVersionはそれらの 依存関係が許可を与えたり、要求したりすることを不可能にします。 それらのケースのためのソリューションは、ツールを宣言することです:ノードは=ツールを追加した後、

したがって依存関係ツリーに 戦略後でマージマニフェスト「置き換え」:ノードは=マニフェストにWRITE権限に「置き換え」 、 問題は解決された。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" tools:node="replace"/> 

Source here

私はあなたが私のポイントを持っていない、これは他の誰か

0

このお試しください:私はあなたがドキュメントをチェックお勧め

if (ContextCompat.checkSelfPermission(this, 
       Manifest.permission.ACCESS_COARSE_LOCATION) 
     != PackageManager.PERMISSION_GRANTED) { 

     ActivityCompat.requestPermissions(this, 
       new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 
       PERMISSION_REQUEST_COARSE_LOCATION); 
    } 

を:https://developer.android.com/training/permissions/requesting.html

更新

あなたは、両方のアクセス権のために同じ要求コードを使用しているのはなぜ?

requestPermissions(new String[]{Manifest.permission. ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION); <-- PERMISSION_REQUEST_COARSE_LOCATION 

requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, PERMISSION_REQUEST_COARSE_LOCATION); <-- PERMISSION_REQUEST_COARSE_LOCATION 

変更各要求コード値。

+0

のために有用であると思います。問題は、ACCESS_COARSE_LOCATIONを要求するときに許可要求のプロンプトが表示されているが、WRITE_EXTERNAL_STORAGEを要求しているときは表示されないということです。あなたと私のコードの両方で起こっていること。私は掲示する前にドキュメントを読むだろう;) – gotramaval

+0

私の更新された答えを確認してください – diegoveloper

+0

それはコピー貼り付けの問題、申し訳ありませんでした。私はそれを変更しましたが、まだ問題を解決していません – gotramaval

関連する問題