-3

Je reçois cette erreur après que j'essaye de mettre à jour mes compileSdkVersion etTargetSdkversion plus grand que 22. On dirait que je fais n'importe quelle tâche d'interface graphique dans ma méthode doInBackground mais je suis incapable de comprendre. Je serais très reconnaissant pour une solution.FATAL EXCEPTION: java.lang.SecurityException: besoin autorisation ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION

Ceci est ma trace de la pile:

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)  

Méthode dans la classe WlanInfoAdapter.java:72 est ici:

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

Méthode erreur montrant classe changeableArrayAdapter.java est donnée ci-dessous. sa méthode où getNewItems() est appelée: 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; 
      } 

Répondre

0

ajouter à votre AndroidManifest.xml avant application tag

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

également pour la version Android> = 23, vous devez demander des autorisations en exécution

 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 
    } 

Et

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. 
     } 
    } 

Aussi

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

Et

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

Merci pour votre explication complète. Je voudrais savoir si je devrais faire LOCATION_PERMISSION_REQUEST_CODE dernière variable staic et mettre sa valeur à 1 ?? – LanguageMaster

+0

@LanguageMaster oui, c'est exactement ce que c'est –

+0

Vous êtes géniaux Mannn. Tu as fait ma journée. Merci beaucoup ..son travail – LanguageMaster

0

Vous devez ajouter ACCESS_COARSE_LOCATION ou ACCESS_FINE_LOCATION que les autorisations à votre fichier manifeste Android.

+0

Merci pour vous répondre. – LanguageMaster

0

Si vous ciblez API 22 seulement alors vous devez ajouter ces 2 la permission dans votre fichier manifeste Android

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

Et si vous visez pour Android Marshmallow (Api 23 et ci-dessus) vous devez donner l'autorisation d'exécution dans votre application.

+0

merci pour votre réponse. J'ai déjà ajouté deux autorisations dans mon fichier manifeste. Toujours mon application plante. Je pense que je vais essayer de donner l'autorisation d'exécution dans mon application. je voudrais demander est ce que vous parlez de https://developer.android.com/training/permissions/requesting.html, sinon s'il vous plaît me fournir le bon lien si c'est possible. serait beaucoup reconnaissant – LanguageMaster

+0

Oui ceci seulement. Ou vous pouvez google sur la façon d'ajouter l'autorisation d'exécution de l'emplacement grossier dans android –