2017-11-15 12 views
0

Ich habe eine Aktivität, die sich erstreckt AppCompatActivity. Damit diese Aktivität ausgeführt werden kann, muss ich der App die Berechtigungen ACCESS_COARSE_LOCATION und WRITE_EXTERNAL_STORAGE gewähren. Alles funktionierte gut, bis ich auf Android Studio 3.0 aktualisiert habe. JetztanfragePermissionsaufforderung wird nicht angezeigt

wird die Aufforderung zum Anfordern WRITE_EXTERNAL_STORAGE Berechtigungen nicht angezeigt wird, und die Funktion

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

zurückkehrt -1 bei grantResults ohne zu fragen.

Dieses Verhalten tritt nicht auf, wenn ich die Berechtigung ACCESS_COARSE_LOCATION anfordern, die so funktioniert, wie es sollte. Unten beide prüft der Code aufrufen:

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(); 
      } 
     } 

Und die andere:

 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(); 
      } 
     } 

Der entsprechende Abschnitt in meinem Manifest sieht wie folgt aus:

<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" /> 

ich viele Dinge gelesen habe, aber das ist ziemlich seltsam, wenn einige Arten von Berechtigungen den Anfragedialog anzeigen, während andere nicht sind. Übrigens, es gibt keine SD-Karte im Gerät (immer internen Speicher verwendet), aber das war nie ein Problem.

Sowohl mein targetSdkVersion und compileSdkVersion sind 26

EDIT

Andere relevante Berechtigungen, wie READ_EXTERNAL_STORAGE sind auch richtig funktioniert. Es ist nur ein Problem mit der Schreibberechtigung. Getestet auf zwei Android-Geräte und Emulator

komplette onCreate Methode:

@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; 
     } 
    }); 

} 

Vielen Dank im Voraus.

Antwort

1

Stellt sich heraus, dass das Problem aufgrund der neuen Version von HockeyApp ist. HockeySDK ist in meiner Anwendung integriert. Jetzt seit Version 5.0.0, sagt die docs:

für Android O, HockeySDK-Android jetzt begrenzt die WRITE_EXTERNAL_STORAGE Erlaubnis mit dem maxSdkVersion Filter bereit zu sein. In sind einige Anwendungsfälle, z.B. Wenn eine App eine Abhängigkeit enthält, die diese Berechtigung erfordert, macht es maxSdkVersion unmöglich, dass die -Abhängigkeiten die Berechtigung erteilen oder anfordern. Die Lösung für diese Fälle ist es, die Werkzeuge zu erklären: node = „ersetzen“ manifest Strategie später im Abhängigkeitsbaum

So verschmilzt, nach der Zugabe von Tool: node = „ersetzen“, um die Schreibberechtigung im Manifest , das Problem ist behoben.

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

Source here

Ich hoffe, das für jemand anderen

0

Versuchen Sie folgendes:

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); 
    } 

ich Ihnen empfehlen, in der Dokumentation: https://developer.android.com/training/permissions/requesting.html

aktualisieren

Warum verwenden Sie den gleichen Anforderungscode für beide Berechtigungen?

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

und

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

Ändern Sie den Anforderungscode-Wert für jeden einzelnen.

+0

nützlich ist, Sie haben meine Nummer nicht bekam. Das Problem besteht darin, dass die Eingabeaufforderung für die Berechtigungsanforderung angezeigt wird, wenn Sie nach ACCESS_COARSE_LOCATION gefragt werden, jedoch nicht, wenn Sie nach WRITE_EXTERNAL_STORAGE gefragt werden. Das passiert sowohl mit Ihrem als auch mit meinem Code. Ich würde die Dokumentation vor dem Posten lesen;) – gotramaval

+0

Überprüfen Sie meine aktualisierte Antwort – diegoveloper

+0

Das war ein Copy-Paste-Problem, sorry. Ich habe das geändert, aber es löst immer noch nicht das Problem – gotramaval