Bagaimana saya bisa mengaktifkan atau menonaktifkan GPS secara terprogram di Android?

158

Saya tahu bahwa pertanyaan tentang menyalakan / off GPS programatik pada android telah telah dibahas banyak kali , dan jawabannya selalu sama:

"Anda tidak bisa karena alasan keamanan / privasi, Anda harus meneruskan ke layar preferensi lokasi dan membiarkan pengguna mengaktifkan / menonaktifkannya."

Saya mengerti bahwa, bagaimanapun saya baru saja membeli Tasker dari pasar dan, di antara banyak hal lain yang dapat Anda selesaikan, Anda dapat menetapkan aturan untuk mengaktifkan GPS secara otomatis saat memasuki aplikasi yang telah ditentukan dan menonaktifkannya saat keluar (lihat di sini untuk tutorial tentang cara melakukannya, dan itu hanya berfungsi!) dan aplikasi ini tidak dapat ditandatangani dengan kunci penandatanganan firmware karena berfungsi pada banyak versi android dan perangkat yang berbeda dan Anda bahkan tidak perlu di-root.

Saya ingin melakukan ini di aplikasi saya. Tentu saja, saya tidak ingin meledakkan privasi pengguna, jadi saya pertama-tama akan bertanya kepada pengguna apakah dia ingin mengaktifkannya secara otomatis dengan kotak centang "ingat keputusan saya" yang khas dan jika dia menjawab ya, aktifkan.

Apakah ada yang punya ide atau petunjuk tentang bagaimana Tasker mencapai ini?

maid450
sumber

Jawaban:

161

GPS dapat diaktifkan dengan mengeksploitasi bug di widget power manager. lihat utas xda ini untuk diskusi.

inilah beberapa contoh kode yang saya gunakan

private void turnGPSOn(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(!provider.contains("gps")){ //if gps is disabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); 
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

private void turnGPSOff(){
    String provider = Settings.Secure.getString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED);

    if(provider.contains("gps")){ //if gps is enabled
        final Intent poke = new Intent();
        poke.setClassName("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider");
        poke.addCategory(Intent.CATEGORY_ALTERNATIVE);
        poke.setData(Uri.parse("3")); 
        sendBroadcast(poke);
    }
}

gunakan yang berikut ini untuk menguji apakah versi yang ada dari widget kontrol daya adalah yang akan memungkinkan Anda untuk beralih gps.

private boolean canToggleGPS() {
    PackageManager pacman = getPackageManager();
    PackageInfo pacInfo = null;

    try {
        pacInfo = pacman.getPackageInfo("com.android.settings", PackageManager.GET_RECEIVERS);
    } catch (NameNotFoundException e) {
        return false; //package not found
    }

    if(pacInfo != null){
        for(ActivityInfo actInfo : pacInfo.receivers){
            //test if recevier is exported. if so, we can toggle GPS.
            if(actInfo.name.equals("com.android.settings.widget.SettingsAppWidgetProvider") && actInfo.exported){
                return true;
            }
        }
    }

    return false; //default
}
Ben H
sumber
4
Pada saat komentar (saya) ini, tautan dalam jawaban ini tampaknya mengindikasikan bahwa bug yang dieksploitasi baru-baru ini telah diperbaiki. Saya hanya ingin menunjukkan bahwa exploit tersebut tampaknya masih berfungsi dengan baik di lingkungan pengujian saya sendiri, jadi Anda tidak boleh menyerah untuk mencoba ini ... pastikan kode Anda akan menangani kesalahan jika tidak berfungsi !
SilithCrowe
1
Pada tulisan komentar ini, exploit ini masih berfungsi pada ponsel Android 2.2.1. Nice find, Ben H.
Qix - MONICA disalahartikan
38
Ini ide yang sangat buruk. Setelah bug diperbaiki, exploit Anda tidak akan berfungsi lagi. Lebih baik mengirim pengguna ke aplikasi pengaturan.
Edward Falk
1
Bekerja dengan baik di Android 2.3.6 tetapi tidak bekerja Android 4.0.3. Setiap ide untuk mengaktifkan atau menonaktifkan di android 4.0.3
Krishna
5
hahaha ... exploit ini muncul kembali pada 4.2.2, Terkejut melihatnya .. TUHAN!
amithgc
70

Semua jawaban ini tidak diizinkan sekarang. Inilah yang benar:

Untuk semua yang masih mencari Jawaban:

Berikut adalah cara kerja OLA Cabs dan aplikasi sejenis lainnya.

Tambahkan ini di onCreate Anda

if (googleApiClient == null) {
    googleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API).addConnectionCallbacks(this)
            .addOnConnectionFailedListener(Login.this).build();
    googleApiClient.connect();
            LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    // **************************
    builder.setAlwaysShow(true); // this is the key ingredient
    // **************************

    PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi
            .checkLocationSettings(googleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result
                    .getLocationSettingsStates();
            switch (status.getStatusCode()) {
            case LocationSettingsStatusCodes.SUCCESS:
                // All location settings are satisfied. The client can
                // initialize location
                // requests here.
                break;
            case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                // Location settings are not satisfied. But could be
                // fixed by showing the user
                // a dialog.
                try {
                    // Show the dialog by calling
                    // startResolutionForResult(),
                    // and check the result in onActivityResult().
                    status.startResolutionForResult(Login.this, 1000);
                } catch (IntentSender.SendIntentException e) {
                    // Ignore the error.
                }
                break;
            case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                // Location settings are not satisfied. However, we have
                // no way to fix the
                // settings so we won't show the dialog.
                break;
            }
        }
    });
}

Ini adalah metode yang diterapkan:

@Override
public void onConnected(Bundle arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionSuspended(int arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(ConnectionResult arg0) {
    // TODO Auto-generated method stub

}

Berikut adalah Dokumentasi Android untuk hal yang sama.

Ini untuk membantu orang lain jika mereka masih berjuang:

Sunting : Menambahkan komentar Irfan Raza untuk bantuan lebih lanjut.

@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     if (requestCode == 1000) {
         if(resultCode == Activity.RESULT_OK){
             String result=data.getStringExtra("result"); 
         } if (resultCode == Activity.RESULT_CANCELED) {
             //Write your code if there's no result 
         } 
    } 
} 
Akshat
sumber
Sekarang jawaban ini harus diterima. Terima kasih banyak Akshat !!
Gurpreet
2
Membutuhkan integrasi klien Google API karenanya hanya solusi untuk kasus penggunaan tertentu, tidak cocok untuk solusi umum.
Cik
@DroroSingh masalah apa yang Anda hadapi.? Saya menggunakan kode yang sama dan berfungsi dengan baik.
Akshat
1
dapatkah kita mencapai ini tanpa menunjukkan builder itu. Karena saya perlu mengaktifkan gps tanpa menunjukkan peringatan.
Punithapriya
3
@Punithapriya Itu tidak mungkin. Persetujuan pengguna harus dan oleh karena itu pembangun harus ditunjukkan.
Akshat
50

AKTIFKAN GPS:

Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

Nonaktifkan GPS:

Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);
Debugger
sumber
1
secara otomatis GPS akan hidup / mati.
Debugger
1
Ini juga membantu mengaktifkan. private void turnGPSOn () {penyedia string = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contains ("gps")) {// jika gps dinonaktifkan Final Intent poke = new Intent (); poke.setClassName ("com.android.settings", "com.android.settings.widget.SettingsAppWidgetProvider"); poke.addCategory (Intent.CATEGORY_ALTERNATIVE); poke.setData (Uri.parse ("3")); sendBroadcast (poke); }}
Debugger
di android 2.3.4 berjalan di asamsung sII ternyata ikon gps aktif tanpa secara efektif mengaktifkan sensor gps. Tetapi, jika Anda memilih untuk mengaktifkan sensor GPS secara terprogram, itu akan dikenali.
tony gil
24
android 4.0.4 - hanya notifikasi gps yang diaktifkan. bukan gps itu sendiri. jadi sepertinya sudah menyala tapi nyatanya tidak
alex
14
java.lang.SecurityException: Penolakan Izin: tidak diizinkan untuk mengirim siaran android.location.GPS_ENABLED_CHANGE
Abhi
28

Kode ini berfungsi pada ponsel ROOTED jika aplikasi dipindahkan ke /system/aps , dan mereka memiliki izin berikut dalam manifes :

<uses-permission android:name="android.permission.WRITE_SETTINGS"/>
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/>

Kode

private void turnGpsOn (Context context) {
    beforeEnable = Settings.Secure.getString (context.getContentResolver(),
                                              Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
    String newSet = String.format ("%s,%s",
                                   beforeEnable,
                                   LocationManager.GPS_PROVIDER);
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   newSet); 
    } catch(Exception e) {}
}


private void turnGpsOff (Context context) {
    if (null == beforeEnable) {
        String str = Settings.Secure.getString (context.getContentResolver(),
                                                Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
        if (null == str) {
            str = "";
        } else {                
            String[] list = str.split (",");
            str = "";
            int j = 0;
            for (int i = 0; i < list.length; i++) {
                if (!list[i].equals (LocationManager.GPS_PROVIDER)) {
                    if (j > 0) {
                        str += ",";
                    }
                    str += list[i];
                    j++;
                }
            }
            beforeEnable = str;
        }
    }
    try {
        Settings.Secure.putString (context.getContentResolver(),
                                   Settings.Secure.LOCATION_PROVIDERS_ALLOWED,
                                   beforeEnable);
    } catch(Exception e) {}
}
Nate Zaugg
sumber
5
+1 untuk menyebutkan metode ini. Ini harus bekerja dengan aplikasi sistem pada perangkat yang tidak di-root juga.
AlexS
ini jalan yang benar. Bekerja pada setiap versi Android, tidak perlu trik apa pun!
BQuadra
mematikan gps tidak berfungsi !! dapatkah Anda memberi tahu saya mengapa dan solusi yang mungkin.
Shivansh
sekarang gps dimatikan dan
dihidupkan dengan
<menggunakan-izin android: name = "android.permission.WRITE_SECURE_SETTINGS" /> hanya untuk sistem aps
sijo jose
23

Alih-alih menggunakan Pengaturan niat.ACTION_LOCATION_SOURCE_SETTINGS Anda dapat langsung dapat muncul pop up di aplikasi Anda seperti Google Map & pada Gps di klik tombol ok mereka tidak perlu mengarahkan ulang ke pengaturan hanya Anda perlu menggunakan kode saya sebagai

Catatan: Baris kode ini secara otomatis membuka kotak dialog jika Lokasi tidak aktif. Sepotong garis ini digunakan di Google Map juga

 public class MainActivity extends AppCompatActivity
    implements GoogleApiClient.ConnectionCallbacks,
    GoogleApiClient.OnConnectionFailedListener {


LocationRequest mLocationRequest;
GoogleApiClient mGoogleApiClient;
PendingResult<LocationSettingsResult> result;
final static int REQUEST_LOCATION = 199;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this).build();
    mGoogleApiClient.connect();

}

@Override
public void onConnected(Bundle bundle) {

    mLocationRequest = LocationRequest.create();
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    mLocationRequest.setInterval(30 * 1000);
    mLocationRequest.setFastestInterval(5 * 1000);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(mLocationRequest);
    builder.setAlwaysShow(true);

    result = LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());

    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            //final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    //...
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                MainActivity.this,
                                REQUEST_LOCATION);
                    } catch (SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    //...
                    break;
            }
        }
    });

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
    Log.d("onActivityResult()", Integer.toString(resultCode));

    //final LocationSettingsStates states = LocationSettingsStates.fromIntent(data);
    switch (requestCode)
    {
        case REQUEST_LOCATION:
            switch (resultCode)
            {
                case Activity.RESULT_OK:
                {
                    // All required changes were successfully made
                    Toast.makeText(MainActivity.this, "Location enabled by user!", Toast.LENGTH_LONG).show();
                    break;
                }
                case Activity.RESULT_CANCELED:
                {
                    // The user was asked to change settings, but chose not to
                    Toast.makeText(MainActivity.this, "Location not enabled, user cancelled.", Toast.LENGTH_LONG).show();
                    break;
                }
                default:
                {
                    break;
                }
            }
            break;
    }
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}
} 

Catatan: Baris kode ini secara otomatis membuka kotak dialog jika Lokasi tidak aktif. Sepotong garis ini digunakan di Google Map juga

Kuda Hitam
sumber
1
kode ini berfungsi dengan baik tetapi jangan lupa izin lokasi dan toples layanan dalam file gradle ...
Akash pasupathi
22

Sejak Android versi 4.4, Anda tidak dapat mengaktifkan / menonaktifkan gps secara programatik. Jika Anda mencoba kode yang diajukan pada jawaban ini , pengecualian akan dipecat.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE
Amaury Medeiros
sumber
2
Jadi apakah ini sebuah komentar atau apa solusinya?
Shylendra Madda
@ Shylendra Madda Tidak ada solusi untuk mengaktifkan GPS. Anda hanya dapat menjalankan dialog sistem yang sesuai.
luar biasa
6

Untuk menghidupkan atau mematikan GPS secara terprogram Anda membutuhkan akses 'root' dan BusyBox diinstal. Bahkan dengan itu, tugasnya tidak sepele.

Contoh ada di sini: Google Drive , Github , Sourceforge

Diuji dengan Android 2.3.5 dan 4.1.2.

OGP
sumber
sampel tidak tersedia lagi
pengembang android
Inilah yang terbaru: rapidshare.com/files/1458124346/GPSToggler-20130222.7z Saya menghapus versi lama secara tidak sengaja. BusyBox tidak diperlukan lagi.
OGP
masih belum tersedia. mungkin menggunakan layanan unggah file yang berbeda?
pengembang android
Saya menjadikan folder itu publik dan diverifikasi. Sekarang sudah bisa diunduh. Juga FTP pribadi saya di sini: StackExchange: [email protected]
OGP
5

Di atas jawaban yang benar sangat lama itu membutuhkan sesuatu yang baru jadi Inilah jawabannya

Seperti dalam pembaruan terakhir kami memiliki dukungan androidx jadi pertama-tama sertakan ketergantungan dalam file build.gradle tingkat aplikasi Anda

implementation 'com.google.android.gms:play-services-location:17.0.0'

lalu tambahkan file manifes Anda:

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

jangan lupa untuk mengambil persetujuan pengguna untuk izin ini jika Anda melepaskan

sekarang di sini adalah kode gunakan saja

 protected void createLocationRequest() {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setInterval(10000);
    locationRequest.setFastestInterval(5000);
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);

    SettingsClient client = LocationServices.getSettingsClient(this);
    Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());



    task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
        @Override
        public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
            // All location settings are satisfied. The client can initialize
            // location requests here.
            // ...

            Toast.makeText(MainActivity.this, "Gps already open", 
                                          Toast.LENGTH_LONG).show();
            Log.d("location settings",locationSettingsResponse.toString());
        }
    });

    task.addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            if (e instanceof ResolvableApiException) {
                // Location settings are not satisfied, but this can be fixed
                // by showing the user a dialog.
                try {
                    // Show the dialog by calling startResolutionForResult(),
                    // and check the result in onActivityResult().
                    ResolvableApiException resolvable = (ResolvableApiException) e;
                    resolvable.startResolutionForResult(MainActivity.this,
                            REQUEST_CHECK_SETTINGS);
                } catch (IntentSender.SendIntentException sendEx) {
                    // Ignore the error.
                }
            }
        }
    });
}


@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode==REQUEST_CHECK_SETTINGS){

        if(resultCode==RESULT_OK){

            Toast.makeText(this, "Gps opened", Toast.LENGTH_SHORT).show();
            //if user allows to open gps
            Log.d("result ok",data.toString());

        }else if(resultCode==RESULT_CANCELED){

            Toast.makeText(this, "refused to open gps", 
                                         Toast.LENGTH_SHORT).show();
            // in case user back press or refuses to open gps
            Log.d("result cancelled",data.toString());
        }
    }
}

jika ada masalah, harap ping saya

Mratyunjay Tripathi
sumber
2

Sebuah jawaban dikembangkan di pertanyaan lain, tetapi sudah ditutup, dan saya ingin komunitas mencobanya juga.

boolean gpsStatus = locmanager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if (!gpsStatus) {
    Settings.Secure.putString(getContentResolver(), Settings.Secure.LOCATION_PROVIDERS_ALLOWED, "network,gps");
}

Lihat komentar ini

Solusi ini akan membutuhkan WRITE_SETTINGSdan WRITE_SECURE_SETTINGSizin.

gobernador
sumber
@milind, misalkan saya memiliki perangkat yang sudah di-rooting, apa yang harus saya lakukan untuk menggunakan kode ini? Saya sudah mencoba untuk mendapatkan izin root untuk aplikasi, tetapi itu tidak membantu. ia terus mengatakan "Penolakan izin: menulis ke pengaturan aman memerlukan android.permission.WRITE_SECURE_SETTINGS"
pengembang android
@android Baca kalimat terakhir dari posting ini. Menggunakan metode ini akan memerlukan android.permission.WRITE_SECURE_SETTINGSizin dalam Manifest.
gobernador
1
aku tahu . saya sudah menambahkannya. itu memberitahu saya bahwa meskipun sudah ada dalam manifes.
pengembang android
jadi tidak mungkin bahkan untuk perangkat yang di-rooting ?!
pengembang android
2

Mungkin dengan trik refleksi di sekitar kelas android.server.LocationManagerService.

Juga, ada metode (karena API 8) android.provider.Settings.Secure.setLocationProviderEnabled

Damian Kołakowski
sumber
3
Settings.SecureKelas ini tampaknya menjanjikan, namun saya mendapatkan pengecualian keamanan yang mengatakan bahwa saya memerlukan android.permission.WRITE_SECURE_SETTINGS, dan saya terus mendapatkan kesalahan bahkan menambahkan izin ini (dan juga WRITE_SETTINGS) ke manifes saya. Tapi sepertinya ini cara yang baik untuk terus mencari. Terima kasih :)
maid450
WRITE_SECURE_SETTINGSmemiliki tingkat perlindungan yangsystemOrSignature Anda perlukan untuk menjadikan aplikasi itu aplikasi sistem agar bisa berfungsi, yang juga disebutkan dalam jawaban ini .
Alir
2

Ini adalah solusi terbaik yang disediakan oleh Google Developers. Cukup panggil metode ini di onResume onCreate setelah inisialisasi GoogleApiClient.

private void updateMarkers() {
    if (mMap == null) {
        return;
    }

    if (mLocationPermissionGranted) {
        // Get the businesses and other points of interest located
        // nearest to the device's current location.
         mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API).build();
        mGoogleApiClient.connect();
        LocationRequest locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(10000);
        locationRequest.setFastestInterval(10000 / 2);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder().addLocationRequest(locationRequest);
        builder.setAlwaysShow(true);


        LocationSettingsRequest.Builder builder = new LocationSettingsRequest
                .Builder()
                .addLocationRequest(mLocationRequest);
        PendingResult<LocationSettingsResult> resultPendingResult = LocationServices
                .SettingsApi
                .checkLocationSettings(mGoogleApiClient, builder.build());

        resultPendingResult.setResultCallback(new ResultCallback<LocationSettingsResult>() {
            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();
                final LocationSettingsStates locationSettingsStates = locationSettingsResult.getLocationSettingsStates();
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        // All location settings are satisfied. The client can
                        // initialize location requests here.

                        break;
                    case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                        // Location settings are not satisfied, but this can be fixed
                        // by showing the user a dialog.


                        try {
                            // Show the dialog by calling startResolutionForResult(),
                            // and check the result in onActivityResult().
                            status.startResolutionForResult(
                                    MainActivity.this,
                                    PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
                        } catch (IntentSender.SendIntentException e) {
                            // Ignore the error.


                        }
                        break;
                    case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                        // Location settings are not satisfied. However, we have no way
                        // to fix the settings so we won't show the dialog.


                        break;
                }

            }
        });


        @SuppressWarnings("MissingPermission")
        PendingResult<PlaceLikelihoodBuffer> result = Places.PlaceDetectionApi
                .getCurrentPlace(mGoogleApiClient, null);
        result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
            @Override
            public void onResult(@NonNull PlaceLikelihoodBuffer likelyPlaces) {
                for (PlaceLikelihood placeLikelihood : likelyPlaces) {
                    // Add a marker for each place near the device's current location, with an
                    // info window showing place information.
                    String attributions = (String) placeLikelihood.getPlace().getAttributions();
                    String snippet = (String) placeLikelihood.getPlace().getAddress();
                    if (attributions != null) {
                        snippet = snippet + "\n" + attributions;
                    }

                    mMap.addMarker(new MarkerOptions()
                            .position(placeLikelihood.getPlace().getLatLng())
                            .title((String) placeLikelihood.getPlace().getName())
                            .snippet(snippet));
                }
                // Release the place likelihood buffer.
                likelyPlaces.release();
            }
        });
    } else {
        mMap.addMarker(new MarkerOptions()
                .position(mDefaultLocation)
                .title(getString(R.string.default_info_title))
                .snippet(getString(R.string.default_info_snippet)));
    }
}

Catatan: Baris kode ini secara otomatis membuka kotak dialog jika Locationtidak aktif. Sepotong garis ini digunakan di Google Map juga

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
AMAN SINGH
sumber
Apa itu mLocationPembissionGranted ?
b devloper
itu untuk memeriksa apakah izin diberikan atau tidak untuk Lokasi. ini run timeizin yang diberikan.
AMAN SINGH
Anda juga dapat melewatinya dengan hanya mengatur nilai true, jika Anda sudah memberikan izin pada perangkat pra-lollipop
AMAN SINGH
2

Kode ini berfungsi pada ponsel ROOTED:

public class MainActivity extends AppCompatActivity {

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

        String[] cmds = {"cd /system/bin" ,"settings put secure location_providers_allowed +gps"};
        try {
            Process p = Runtime.getRuntime().exec("su");
            DataOutputStream os = new DataOutputStream(p.getOutputStream());
            for (String tmpCmd : cmds) {
                os.writeBytes(tmpCmd + "\n");
            }
            os.writeBytes("exit\n");
            os.flush();
        }
        catch (IOException e){
            e.printStackTrace();
        }
    }
}

Untuk mematikan GPS Anda dapat menggunakan perintah ini sebagai gantinya

settings put secure location_providers_allowed -gps

Anda juga dapat mengubah akurasi jaringan menggunakan perintah berikut: untuk menghidupkan penggunaan:

settings put secure location_providers_allowed +network

dan untuk mematikan Anda dapat menggunakan:

settings put secure location_providers_allowed -network
DarwinFernandez
sumber
1

Banyak hal telah berubah sejak pertanyaan ini diposting, sekarang dengan API Layanan Google, Anda dapat meminta pengguna untuk mengaktifkan GPS:

https://developers.google.com/places/android-api/current-place

Anda perlu meminta izin ACCESS_FINE_LOCATION di manifes Anda:

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

Tonton juga video ini:

https://www.youtube.com/watch?v=F0Kh_RnSM0w

Hooman
sumber
Terima kasih. Tetapi Google Play Services 7 dapat digunakan dengan versi android lama? (API 14 - 23)
JCarlosR
1

Yang ini bekerja untuk saya.

Lebih sederhana daripada jawaban Rj0078 dalam pertanyaan ini ( https://stackoverflow.com/a/42556648/11211963 ), tetapi jawaban itu juga berfungsi.

Ini menunjukkan dialog seperti ini:

masukkan deskripsi gambar di sini

(Ditulis dalam Kotlin)

    googleApiClient = GoogleApiClient.Builder(context!!)
        .addApi(LocationServices.API).build()
    googleApiClient!!.connect()
    locationRequest = LocationRequest.create()
    locationRequest!!.priority = LocationRequest.PRIORITY_HIGH_ACCURACY
    locationRequest!!.interval = 30 * 1000.toLong()
    locationRequest!!.fastestInterval = 5 * 1000.toLong()

    val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest!!)
    builder.setAlwaysShow(true)

    result =
       LocationServices.SettingsApi.checkLocationSettings(googleApiClient, builder.build())
    result!!.setResultCallback { result ->
        val status: Status = result.status
        when (status.statusCode) {
            LocationSettingsStatusCodes.SUCCESS -> {
               // Do something
            }
            LocationSettingsStatusCodes.RESOLUTION_REQUIRED ->
                try {
                    startResolutionForResult(),
                    status.startResolutionForResult(
                        activity,
                        REQUEST_LOCATION
                    )
                } catch (e: SendIntentException) {
                }
            LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE -> {
                // Do something
            }
        }
    }
Marci
sumber
0

Anda hanya perlu menghapus LocationListenerdariLocationManager

manager.removeUpdates(listener);
kelancangan
sumber
-1

Gunakan kode ini Sederhana dan Mudah Diakses:

Izin:

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

Ikuti Kode ini untuk mengakses GPS secara terprogram:

LocationManager locationManager ;
 boolean GpsStatus ;


            GPSStatus();

            if(GpsStatus == true)
            {
                textview.setText("Your Location Services Is Enabled");
            }else
                {textview.setText("Your Location Services Is Disabled");}

            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);


    public void GPSStatus(){
    locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    GpsStatus = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} 
Gaurav Lambole
sumber