Autore Topic: Add permission check - Come fare?  (Letto 1247 volte)

Offline whirl

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G4
  • Sistema operativo:
    Windows 10
Add permission check - Come fare?
« il: 03 Dicembre 2015, 18:09:03 CET »
0
Ciao a tutti, sto cercando dei tutorial da seguire per imparare e fare pratica.
Ieri ho trovato questo tutorial, che sembra interessante, però l'autore sembra aver dimenticato qualcosa.
Ecco il link al tutorial, che contiene anche i sorgenti scaricabili: Android GPS Location Tutorial

Ecco il codice della classe GPSTracker:

Codice (Java): [Seleziona]
package com.cs2guru.androidgps;

import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

public class GPSTracker extends Service implements LocationListener {

        private final Context mContext;

        // flag for GPS status
        boolean isGPSEnabled = false;

        // flag for network status
        boolean isNetworkEnabled = false;

        // flag for GPS status
        boolean canGetLocation = false;

        Location location; // location
        double latitude; // latitude
        double longitude; // longitude

        // The minimum distance to change Updates in meters
        private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters

        // The minimum time between updates in milliseconds
        private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute

        // Declaring a Location Manager
        protected LocationManager locationManager;

        public GPSTracker(Context context) {
                this.mContext = context;
                getLocation();
        }

        public Location getLocation() {
                try {
                        locationManager = (LocationManager) mContext
                                        .getSystemService(LOCATION_SERVICE);

                        // getting GPS status
                        isGPSEnabled = locationManager
                                        .isProviderEnabled(LocationManager.GPS_PROVIDER);

                        // getting network status
                        isNetworkEnabled = locationManager
                                        .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

                        if (!isGPSEnabled && !isNetworkEnabled) {
                                // no network provider is enabled
                        } else {
                                this.canGetLocation = true;
                                if (isNetworkEnabled) {
                                        locationManager.requestLocationUpdates(
                                                        LocationManager.NETWORK_PROVIDER,
                                                        MIN_TIME_BW_UPDATES,
                                                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                                        Log.d("Network", "Network");
                                        if (locationManager != null) {
                                                location = locationManager
                                                                .getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                                                if (location != null) {
                                                        latitude = location.getLatitude();
                                                        longitude = location.getLongitude();
                                                }
                                        }
                                }
                                // if GPS Enabled get lat/long using GPS Services
                                if (isGPSEnabled) {
                                        if (location == null) {
                                                locationManager.requestLocationUpdates(
                                                                LocationManager.GPS_PROVIDER,
                                                                MIN_TIME_BW_UPDATES,
                                                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                                                Log.d("GPS Enabled", "GPS Enabled");
                                                if (locationManager != null) {
                                                        location = locationManager
                                                                        .getLastKnownLocation(LocationManager.GPS_PROVIDER);
                                                        if (location != null) {
                                                                latitude = location.getLatitude();
                                                                longitude = location.getLongitude();
                                                        }
                                                }
                                        }
                                }
                        }

                } catch (Exception e) {
                        e.printStackTrace();
                }

                return location;
        }

        /**
         * Stop using GPS listener Calling this function will stop using GPS in your
         * app
         * */

        public void stopUsingGPS() {
                if (locationManager != null) {
                        locationManager.removeUpdates(GPSTracker.this);
                }
        }

        /**
         * Function to get latitude
         * */

        public double getLatitude() {
                if (location != null) {
                        latitude = location.getLatitude();
                }

                // return latitude
                return latitude;
        }

        /**
         * Function to get longitude
         * */

        public double getLongitude() {
                if (location != null) {
                        longitude = location.getLongitude();
                }

                // return longitude
                return longitude;
        }

        /**
         * Function to check GPS/wifi enabled
         *
         * @return boolean
         * */

        public boolean canGetLocation() {
                return this.canGetLocation;
        }

        /**
         * Function to show settings alert dialog On pressing Settings button will
         * lauch Settings Options
         * */

        public void showSettingsAlert() {
                AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);

                // Setting Dialog Title
                alertDialog.setTitle("GPS is settings");

                // Setting Dialog Message
                alertDialog
                        .setMessage("GPS is not enabled. Do you want to go to settings menu?");

                // On pressing Settings button
                alertDialog.setPositiveButton("Settings",
                                new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                Intent intent = new Intent(
                                                                Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                                                mContext.startActivity(intent);
                                        }
                                });

                // on pressing cancel button
                alertDialog.setNegativeButton("Cancel",
                                new DialogInterface.OnClickListener() {
                                        public void onClick(DialogInterface dialog, int which) {
                                                dialog.cancel();
                                        }
                                });

                // Showing Alert Message
                alertDialog.show();
        }

        @Override
        public void onLocationChanged(Location location) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

E' tutto piuttosto comprensibile, dopo aver scritto tutto il codice, però, nella classe GPSTracker mi viene chiesto di aggiungere un permission check. Se gli do l'ok mi scrive automaticamente queste righe di codice (sto usando Android Studio 1.5):

Codice (Java): [Seleziona]
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                    // TODO: Consider calling
                    //    ActivityCompat#requestPermissions
                    // here to request the missing permissions, and then overriding
                    //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                    //                                          int[] grantResults)
                    // to handle the case where the user grants the permission. See the documentation
                    // for ActivityCompat#requestPermissions for more details.
                    return TODO;
                }

Qualcuno di vuoi può provare a eseguire il codice e vedere se compare lo stesso errore?
Il codice potete scaricarlo cliccando su questo link: http://www.cs2guru.com/downloads/android/apk/AndroidGPS.zip


Grazie a chi mi aiuterà  :-)
« Ultima modifica: 03 Dicembre 2015, 18:23:13 CET da whirl »

Offline iClaude

  • Utente normale
  • ***
  • Post: 247
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S8
  • Sistema operativo:
    Windows 10
Re:Add permission check - Come fare?
« Risposta #1 il: 04 Dicembre 2015, 08:57:07 CET »
0
Non è un errore: è il nuovo sistema di gestione dei permessi di Marshmallow, come spiegato qua: Requesting Permissions at Run Time | Android Developers

Altrimenti puoi mettere 22 come target SDK ed utilizzare il sistema precedente, senza bisogno di chiedere i permessi al runtime.

Offline whirl

  • Nuovo arrivato
  • *
  • Post: 3
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    LG G4
  • Sistema operativo:
    Windows 10
Re:Add permission check - Come fare?
« Risposta #2 il: 04 Dicembre 2015, 09:43:20 CET »
0
Ciao iClaude, grazie per aver risposto :)
Forse ho capito dove ho sbagliato, nell'emulatore ho android 2.2 ma se non sbaglio non ho impostato il target sdk nel file manifest!
Appena torno a casa provo, grazie

Edit: ho provato però gli errori non vanno via  :-\
« Ultima modifica: 04 Dicembre 2015, 22:40:00 CET da whirl »