Làm cách nào tôi có thể bật hoặc tắt GPS lập trình trên Android?


158

Tôi biết rằng câu hỏi về bật / tắt GPS theo chương trình trên Android đã được thảo luận nhiều lần và câu trả lời luôn luôn giống nhau:

"Bạn không thể vì lý do bảo mật / quyền riêng tư, bạn phải chuyển tiếp đến màn hình tùy chọn vị trí và cho phép người dùng bật / tắt nó."

Tôi hiểu rằng, tuy nhiên gần đây tôi đã mua Tasker từ thị trường và, trong số nhiều thứ khác bạn có thể thực hiện với nó, bạn có thể đặt quy tắc để tự động bật GPS khi vào các ứng dụng được xác định trước và vô hiệu hóa khi thoát (xem tại đây để biết hướng dẫn về cách thực hiện và nó chỉ hoạt động!) và ứng dụng này không thể được ký bằng khóa ký phần sụn vì nó hoạt động trên nhiều phiên bản Android và các thiết bị khác nhau và bạn thậm chí không cần phải root.

Tôi muốn làm điều này trong ứng dụng của tôi. Tất nhiên, tôi không muốn làm mất quyền riêng tư của người dùng, vì vậy trước tiên tôi sẽ hỏi người dùng nếu anh ta muốn tự động bật nó bằng hộp kiểm "nhớ quyết định của tôi" điển hình và nếu anh ta trả lời có, hãy bật nó.

Có ai có bất kỳ ý tưởng hoặc manh mối nào về cách mà Tasker đạt được điều này không?

Câu trả lời:


161

GPS có thể được bật bằng cách khai thác lỗi trong tiện ích quản lý nguồn. xem chủ đề xda này để thảo luận.

đây là một số ví dụ mã tôi sử dụng

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

sử dụng cách sau để kiểm tra xem phiên bản hiện có của tiện ích điều khiển nguồn có phải là phiên bản cho phép bạn chuyển đổi gps hay không.

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
}

4
Tại thời điểm nhận xét (của tôi) này, các liên kết trong câu trả lời này dường như chỉ ra rằng lỗi khai thác gần đây đã được sửa. Tôi chỉ muốn chỉ ra rằng khai thác dường như vẫn hoạt động tốt trong môi trường thử nghiệm của riêng tôi, vì vậy bạn không nên từ bỏ việc thử này ... chỉ cần chắc chắn rằng mã của bạn sẽ xử lý bất kỳ lỗi nào nếu nó không hoạt động !
SilithCrowe

1
Khi viết bình luận này, khai thác này vẫn hoạt động trên điện thoại Android 2.2.1. Tìm thấy tốt đẹp, Ben H.
Qix - MONICA ĐƯỢC PHÂN PHỐI

38
Đây là một ý tưởng thực sự xấu. Khi lỗi được sửa, khai thác của bạn sẽ không còn hoạt động. Tốt hơn là chỉ gửi người dùng đến ứng dụng cài đặt.
Edward Falk

1
Hoạt động tốt trong Android 2.3.6 nhưng không hoạt động Android 4.0.3. Bất kỳ ý tưởng nào để bật hoặc tắt trong android 4.0.3
Krishna

5
hahaha ... khai thác này được tái hiện trong 4.2.2, Thật ngạc nhiên khi thấy nó .. THIÊN CHÚA!
amithgc

70

Tất cả những câu trả lời này không được phép bây giờ. Đây là một trong những chính xác:

Đối với tất cả những người vẫn đang tìm kiếm Câu trả lời:

Dưới đây là cách OLA Cabs và các ứng dụng như vậy đang làm điều đó.

Thêm cái này vào onCreate của bạn

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

Đây là các phương pháp cấy ghép:

@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

}

Đây là Tài liệu Android cho cùng.

Điều này là để giúp đỡ những kẻ khác nếu họ vẫn đang vật lộn:

Chỉnh sửa : Thêm nhận xét của Irfan Raza để được trợ giúp thêm.

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

Bây giờ câu trả lời này nên được chấp nhận. Cảm ơn rất nhiều Akshat !!
Gurpreet

2
Do đó, cần tích hợp ứng dụng khách API của Google do đó chỉ là giải pháp cho các trường hợp sử dụng cụ thể, không phù hợp với giải pháp chung.
Cik

@DilroopSingh bạn đang gặp phải vấn đề gì? Tôi đang sử dụng cùng một mã và nó hoạt động hoàn hảo.
Akshat

1
chúng ta có thể đạt được điều này mà không hiển thị trình xây dựng đó không. Bởi vì tôi cần bật gps mà không hiển thị bất kỳ cảnh báo nào.
Punithapriya

3
@Punithapriya Không thể. Sự đồng ý của người dùng là phải và do đó, người xây dựng phải được hiển thị.
Akshat

50

GPS ENABLE:

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

GPS DISABLE:

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

1
GPS sẽ tự động bật / tắt.
Trình gỡ lỗi

1
Điều này cũng giúp cho phép. private void TurnGPSOn () {String day = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! Carrier.contains ("gps")) {// nếu gps bị vô hiệu hóa cuối cùng Intent poke = new Intent (); poke.setClassName ("com.android.sinstall", "com.android.sinstall.widget.SinstallAppWidgetProvider"); poke.addC Category (Intent.CATEGORY_ALTERNECT); poke.setData (Uri.parse ("3")); sendBroadcast (chọc); }}
Trình gỡ lỗi

Trong Android 2.3.4 chạy trên asamsung sII, nó bật biểu tượng gps mà không kích hoạt hiệu quả cảm biến gps. Nhưng, nếu bạn chọn bật cảm biến GPS theo chương trình, thì nó sẽ được nhận ra.
tony gil

24
android 4.0.4 - chỉ bật thông báo gps . không phải là chính gps. vì vậy nó trông giống như trên nhưng thực tế không phải vậy
alex

14
java.lang.SecurityException: Quyền từ chối: không được phép gửi phát sóng android.location.GPS_ENABLED_CHANGE
Abhi

28

Mã này hoạt động trên bắt nguồn từ điện thoại nếu ứng dụng được chuyển đến /system/aps , và họ có quyền sau đây trong manifest :

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

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

5
+1 để đề cập đến phương pháp này. Nó cũng hoạt động với một ứng dụng hệ thống trên một thiết bị không được quản lý.
AlexS

đây là cách đúng đắn Hoạt động trên mọi phiên bản Android, không cần bất kỳ thủ thuật nào!
BQuadra

tắt gps không hoạt động !! bạn có thể vui lòng cho tôi biết tại sao và giải pháp có thể.
Shivansh

bây giờ gps đang tắt và bật hoàn hảo nhưng GPS không hoạt động, tức là cung cấp vị trí trong khoảng thời gian dài 0,0
Shivansh

<used
allow

22

Kể từ phiên bản Android 4.4, bạn không thể bật / tắt gps theo chương trình. Nếu bạn thử mã được đề xuất cho câu trả lời này , một ngoại lệ sẽ được loại bỏ.

java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.location.GPS_ENABLED_CHANGE

2
Vì vậy, nó là một nhận xét hoặc giải pháp khác là gì?
Shylendra Madda

@Shylendra Madda Không có giải pháp nào cho phép GPS. Bạn chỉ có thể gọi hộp thoại hệ thống tương ứng.
Ngày

22

Thay vì sử dụng mục đích Cài đặt.ACTION_LOCATION_SOURCE_SettING, bạn có thể trực tiếp hiển thị bật lên trong ứng dụng của mình như Google Map & trên Gps khi nhấp vào nút ok, họ không cần phải chuyển hướng sang cài đặt đơn giản là bạn cần sử dụng mã của tôi như

Lưu ý: Dòng mã này tự động mở hộp thoại nếu Vị trí không bật. Đoạn này cũng được sử dụng trong Google Map

 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) {

}
} 

Lưu ý: Dòng mã này tự động mở hộp thoại nếu Vị trí không bật. Đoạn này cũng được sử dụng trong Google Map


1
mã này đang hoạt động tốt nhưng đừng quên quyền truy cập vị trí và jar dịch vụ trong tệp lớp ...
Akash pasupathi

6

Để bật hoặc tắt GPS theo chương trình, bạn cần có quyền truy cập 'root' và BusyBox được cài đặt. Ngay cả với những người đó, nhiệm vụ không phải là nhỏ.

Mẫu ở đây: Google Drive , Github , Sourceforge

Đã thử nghiệm với Android 2.3.5 và 4.1.2.


mẫu không có sẵn nữa.
nhà phát triển Android

Đây là bản mới nhất: Rapidshare.com/files/1458124346/GPSToggler-20130222.7z Tôi đã xóa phiên bản cũ một cách tình cờ. BusyBox không cần thiết nữa.
OGP

vẫn không có sẵn có thể sử dụng một dịch vụ tải lên tập tin khác nhau?
nhà phát triển Android

Tôi đã công khai thư mục và xác minh. Bây giờ nó có thể được tải xuống. Ngoài ra FTP riêng của tôi ở đây: StackExchange: se@oldgopher.gotdns.com
OGP


5

Trên đây câu trả lời đúng là rất cũ nó cần một cái gì đó mới vì vậy đây là câu trả lời

Như trong bản cập nhật mới nhất, chúng tôi có hỗ trợ androidx, vì vậy trước tiên hãy bao gồm sự phụ thuộc trong tệp build.gradle cấp ứng dụng của bạn

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

sau đó thêm vào tệp kê khai của bạn:

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

đừng quên có sự đồng ý của người dùng đối với các quyền này nếu bạn phát hành

Bây giờ đây là mã chỉ cần sử dụng nó

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

nếu có vấn đề gì đó xin vui lòng ping tôi


2

Một câu trả lời đã được phát triển trong một câu hỏi khác, nhưng nó đã bị đóng và tôi cũng muốn cộng đồng dùng thử.

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

Xem bình luận này

Giải pháp này sẽ yêu cầu WRITE_SETTINGSWRITE_SECURE_SETTINGSquyền.


@milind, giả sử tôi có một thiết bị đã root, tôi nên làm gì để sử dụng mã này? Tôi đã cố gắng để có được quyền root cho ứng dụng, nhưng nó không giúp được gì. nó cứ nói "Từ chối quyền: viết vào các cài đặt an toàn yêu cầu ERIC.WRITE_SECURE_SETTINGS"
nhà phát triển Android

@android Đọc câu cuối cùng của bài này. Sử dụng phương pháp này sẽ yêu cầu sự android.permission.WRITE_SECURE_SETTINGScho phép trong Bản kê khai.
gobernador

1
tôi biết . tôi đã thêm nó rồi nó nói với tôi rằng mặc dù nó đã có trong bảng kê khai.
nhà phát triển Android


Vì vậy, không thể ngay cả đối với các thiết bị đã root?!
nhà phát triển Android

2

Có thể với các thủ thuật phản ánh xung quanh lớp học android.server.LocationManagerService .

Ngoài ra, có một phương thức (kể từ API 8) android.provider.Settings.Secure.setLocationProviderEnabled


3
Settings.SecureLớp này có vẻ đầy hứa hẹn, tuy nhiên tôi nhận được một ngoại lệ bảo mật nói rằng tôi cần ERIC.WRITE_SECURE_SETTINGS và tôi vẫn nhận được lỗi ngay cả khi thêm quyền này (và WRITE_SettING cũng) vào bảng kê khai của tôi. Nhưng nó có vẻ là một cách tốt để tiếp tục tìm kiếm. Cảm ơn :)
maid450

WRITE_SECURE_SETTINGScó một mức độ bảo vệsystemOrSignature mà bạn cần để biến ứng dụng đó thành một ứng dụng hệ thống để nó hoạt động, điều này cũng được đề cập trong câu trả lời này .
Lưu lượng

2

Đây là giải pháp tốt nhất được cung cấp bởi Google Developers. Chỉ cần gọi phương thức này trong onResume của onCreate sau khi khởi tạo 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)));
    }
}

Lưu ý: Dòng mã này tự động mở hộp thoại nếu Locationkhông bật. Đoạn này cũng được sử dụng trong Google Map

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

MLocationPermissionGranted là gì?
b devloper

đó là để kiểm tra xem sự cho phép có được cấp hay không cho Địa điểm. đây là sự run timecho phép
AMAN SINGH

bạn cũng có thể thực hiện bằng cách chỉ cần đặt giá trị đúng, nếu bạn đã được cấp quyền trên thiết bị tiền kẹo mút
AMAN SINGH

2

Mã này hoạt động trên điện thoại 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();
        }
    }
}

Để tắt GPS, bạn có thể sử dụng lệnh này thay thế

settings put secure location_providers_allowed -gps

Bạn cũng có thể chuyển đổi độ chính xác của mạng bằng các lệnh sau: để bật sử dụng:

settings put secure location_providers_allowed +network

và để tắt bạn có thể sử dụng:

settings put secure location_providers_allowed -network

1

Mọi thứ đã thay đổi kể từ khi câu hỏi này được đăng, giờ đây với API dịch vụ mới của Google, bạn có thể nhắc người dùng kích hoạt GPS:

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

Bạn sẽ cần phải yêu cầu quyền ACCESS_FINE_LOCATION trong tệp kê khai của mình:

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

Cũng xem video này:

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


Cảm ơn. Nhưng Google Play Services 7 có thể được sử dụng với các phiên bản Android cũ? (API 14 - 23)
JCarlosR

1

Cái này làm việc cho tôi

Câu trả lời của Rj0078 đơn giản hơn trong câu hỏi này ( https://stackoverflow.com/a/42556648/11211963 ), nhưng đó cũng hoạt động tốt.

Nó hiển thị một hộp thoại như thế này:

nhập mô tả hình ảnh ở đây

(Viết bằng 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
            }
        }
    }

0

Bạn chỉ cần loại bỏ các LocationListenertừLocationManager

manager.removeUpdates(listener);

-1

Sử dụng mã này Đơn giản và dễ truy cập:

Quyền:

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

Thực hiện theo Mã này để truy cập GPS theo chương trình:

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);
} 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.