-3

Ich bekomme diesen Fehler, nachdem ich versuche, meine compileSdkVersion und TargetSdkversion größer als 22 zu aktualisieren. Scheint so, als ob ich irgendeine GUI-Aufgabe in meinem DoInBackground-Methode, aber ich bin unfähig es herauszufinden. Ich wäre sehr dankbar für eine Lösung.FATALE AUSNAHME: java.lang.SecurityException: Benötigen ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION Erlaubnis

Das ist mein Stack-Trace:

E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1 
        Process: xy.abc.xyz.xy, PID: 15246 
        java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.SecurityException: Need ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to get scan results 
at android.os.Parcel.readException(Parcel.java:1599) 
at android.os.Parcel.readException(Parcel.java:1552) 
at android.net.wifi.IWifiManager$Stub$Proxy.getScanResults(IWifiManager.java:1066) at android.net.wifi.WifiManager.getScanResults(WifiManager.java:1311) 
at xy.abc.xyz.xy.config.WlanInfoAdapter.getNewItems(WlanInfoAdapter.java:72) 
         at xy.abc.xyz.xy.android.data.ChangeableArrayAdapter$1.doInBackground(ChangeableArrayAdapter.java:78) 
         at xy.abc.xyz.xy.android.data.ChangeableArrayAdapter$1.doInBackground(ChangeableArrayAdapter.java:74) 
         at android.os.AsyncTask$2.call(AsyncTask.java:295) 
         at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
         at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
         at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
         at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
         at java.lang.Thread.run(Thread.java:818)  

Methode in der Klasse WlanInfoAdapter.java:72 ist hier:

@Override 
    protected List<WlanInfo> getNewItems() { 
     WifiManager wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); 
     List<ScanResult> scanResults = wifiManager.getScanResults(); 
     List<WlanInfo> infoList = new ArrayList<>(scanResults.size()); 

     WifiInfo connectionInfo = wifiManager.getConnectionInfo(); 

     try { 
      List<WifiConfiguration> configuredNetworks = wifiManager.getConfiguredNetworks(); 
      Map<String, WifiConfiguration> configuredNetworkIds = new HashMap<>(); 
      for (WifiConfiguration configuredNetwork : configuredNetworks) { 
       if (configuredNetwork.SSID != null) { 
        configuredNetworkIds.put(WlanInfo.cleanSSID(configuredNetwork.SSID), configuredNetwork); 
       } else { 

        wifiManager.removeNetwork(configuredNetwork.networkId); 
       } 
      } 

      for (ScanResult scanResult : scanResults) { 
       WlanInfo wlanInfo = new WlanInfo(scanResult); 
       WifiConfiguration configuration = configuredNetworkIds.get(wlanInfo.getSSID()); 
       wlanInfo.setConfiguration(configuration); 
       wlanInfo.setIsActive(configuration != null && configuration.networkId == connectionInfo.getNetworkId()); 


       if (showUnknown || wlanInfo.isConfigured() || wlanInfo.isOpen()) { 
        infoList.add(wlanInfo); 
       } 
      } 
     } 
     catch (Exception e) { e.printStackTrace(); return null; } 
     return infoList; 
    } 

Methode in changeableArrayAdapter.java Klasse zeigt Fehler ist unten angegeben. seine wo getNewItems() -Methode aufgerufen: ChangeableArrayAdapter.java:78 ChangeableArrayAdapter.java:74

public void triggerRefresh() { 
     AsyncTask<Void, Void, List<T>> asyncTask = new AsyncTask<Void, Void, List<T>>() { 
      @Override 
      protected List<T> doInBackground(Void... objects) { 


       return getNewItems(); 

       //return null; 
      } 

Antwort

0

Fügen Sie diese zu Ihrer AndroidManifest.xml vor application Tag

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

auch für Android-Version> = 23, müssen Sie Berechtigungen in der Laufzeit

 if (ContextCompat.checkSelfPermission(YourActivity.this, 
          Manifest.permission.ACCESS_FINE_LOCATION) 
          != PackageManager.PERMISSION_GRANTED 
          && 
          ContextCompat.checkSelfPermission(YourActivity.this, 
            Manifest.permission.ACCESS_COARSE_LOCATION) 
            != PackageManager.PERMISSION_GRANTED) { 
         askForLocationPermissions(); 
     } else { 
      //do your work 
    } 

Und

private void askForLocationPermissions() { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      new android.support.v7.app.AlertDialog.Builder(this) 
        .setTitle("Location permessions needed") 
        .setMessage("you need to allow this permission!") 
        .setPositiveButton("Sure", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
          ActivityCompat.requestPermissions(YourActivity.this, 
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
            LOCATION_PERMISSION_REQUEST_CODE); 
         } 
        }) 
        .setNegativeButton("Not now", new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int which) { 
//          //Do nothing 
         } 
        }) 
        .show(); 

      // Show an expanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 

     } else { 

      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(this, 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        LOCATION_PERMISSION_REQUEST_CODE); 

      // MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an 
      // app-defined int constant. The callback method gets the 
      // result of the request. 
     } 
    } 
anfordern

Auch

@Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { 
     switch (requestCode) { 
      case LOCATION_PERMISSION_REQUEST_CODE: 
       if (isPermissionGranted(permissions, grantResults, Manifest.permission.ACCESS_FINE_LOCATION)) { 
        //Do you work 
       } else { 
        Toast.makeText(this, "Can not proceed! i need permission" , Toast.LENGTH_SHORT).show(); 
       } 
       break; 
     } 
    } 

Und

public static boolean isPermissionGranted(@NonNull String[] grantPermissions, @NonNull int[] grantResults, 
               @NonNull String permission) { 
     for (int i = 0; i < grantPermissions.length; i++) { 
      if (permission.equals(grantPermissions[i])) { 
       return grantResults[i] == PackageManager.PERMISSION_GRANTED; 
      } 
     } 
     return false; 
    } 
+0

hinzufügen Dank für Sie vollständige Erklärung. Ich würde gerne wissen, ob ich LOCATION_PERMISSION_REQUEST_CODE endgültige statische Variable machen und seinen Wert auf 1 setzen soll? – LanguageMaster

+0

@LanguageMaster Ja, genau das ist es –

+0

Sie sind toll Mannn. Du hast meinen Tag gerettet. Vielen Dank ..arbeiten – LanguageMaster

0

Sie benötigen ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION als Berechtigungen auf Ihrem Android-Manifest-Datei hinzuzufügen.

+0

Danke für deine Antwort. – LanguageMaster

0

Wenn Sie API 22 nur Targeting sind, dann müssen Sie diese 2 Erlaubnis in Ihrem Android-Manifest-Datei

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 

hinzuzufügen Und wenn Sie Targeting für Android Eibisch (Api 23 und höher) müssen Sie in Ihrer App die Laufzeitberechtigung erteilen.

+0

danke für deine antwort. Ich habe bereits zwei Berechtigungen in meiner Manifest-Datei hinzugefügt. Immer noch stürzt meine App ab. Ich denke, ich werde versuchen, Runtime-Erlaubnis in meiner App geben. Ich würde gerne fragen, ist das, worüber du sprichst https://developer.android.com/training/permissions/requesting.html, wenn nicht, bitte gib mir den richtigen Link, wenn es möglich ist. wäre sehr dankbar – LanguageMaster

+0

Ja das nur. Oder Sie können es googeln auf, wie Laufzeitberechtigung des groben Standorts in Android –

Verwandte Themen