ฉันจะเปิดใช้งานหรือปิดใช้งาน GPS แบบเป็นโปรแกรมบน Android ได้อย่างไร


158

ฉันรู้ว่าคำถามเกี่ยวกับการเปิด / ปิด GPS บน Android ได้มี การ พูดคุยกัน หลาย ครั้งและคำตอบก็เหมือนกันเสมอ:

"คุณไม่สามารถใช้เหตุผลด้านความปลอดภัย / ความเป็นส่วนตัวคุณต้องส่งต่อไปยังหน้าจอการตั้งค่าตำแหน่งและให้ผู้ใช้เปิด / ปิดการใช้งาน"

ฉันเข้าใจว่าอย่างไรก็ตามฉันเพิ่งซื้อTaskerจากตลาดและในหลาย ๆ สิ่งที่คุณสามารถทำได้คุณสามารถกำหนดกฎให้เปิดใช้งาน GPS โดยอัตโนมัติในการเข้าสู่แอปพลิเคชันที่กำหนดไว้ล่วงหน้าและปิดการใช้งานที่ทางออก (ดูที่นี่สำหรับ สอนเกี่ยวกับวิธีการใช้งานและมันใช้งานได้!) และแอปนี้ไม่สามารถเซ็นชื่อด้วยคีย์การลงนามเฟิร์มแวร์ได้เพราะมันใช้งานได้กับ Android หลายรุ่นและอุปกรณ์ต่าง ๆ และคุณไม่จำเป็นต้องรูท

ฉันต้องการทำสิ่งนี้ในแอปของฉัน แน่นอนฉันไม่ต้องการระเบิดความเป็นส่วนตัวของผู้ใช้ดังนั้นฉันจะถามผู้ใช้ก่อนว่าเขาต้องการเปิดใช้งานโดยอัตโนมัติด้วยช่องทำเครื่องหมาย "จดจำการตัดสินใจของฉัน" ทั่วไปหรือไม่และถ้าเขาตอบว่าใช่ให้เปิดใช้งาน

ใครบ้างมีความคิดหรือเบาะแสว่าทาซเคอร์ได้รับสิ่งนี้หรือไม่?

คำตอบ:


161

สามารถสลับ GPS โดยใช้ประโยชน์จากบั๊กในวิดเจ็ตตัวจัดการพลังงาน ดูหัวข้อนี้xdaสำหรับการสนทนา

นี่คือตัวอย่างโค้ดที่ฉันใช้

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

ใช้สิ่งต่อไปนี้เพื่อทดสอบว่าวิดเจ็ตควบคุมพลังงานเวอร์ชันที่มีอยู่เป็นหนึ่งซึ่งจะช่วยให้คุณสลับจีพีเอสได้หรือไม่

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
ในช่วงเวลาของความคิดเห็น (ของฉัน) ลิงค์ในคำตอบนี้ดูเหมือนจะบ่งชี้ว่าข้อบกพร่องที่หาประโยชน์ได้เพิ่งได้รับการแก้ไข ฉันแค่อยากจะชี้ให้เห็นว่าการหาประโยชน์ยังคงทำงานได้ดีในสภาพแวดล้อมการทดสอบของฉันดังนั้นคุณไม่ควรละทิ้งที่จะลองสิ่งนี้ ... เพียงแค่ตรวจสอบให้แน่ใจว่ารหัสของคุณจะจัดการกับข้อผิดพลาดใด ๆ !
SilithCrowe

1
ในฐานะที่เป็นความคิดเห็นของการเขียนการใช้ประโยชน์นี้ยังคงทำงานบนโทรศัพท์ Android 2.2.1 Nice find, Ben H.
Qix - MONICA ถูกยกเลิกเมื่อ

38
นี่เป็นความคิดที่แย่จริงๆ เมื่อข้อผิดพลาดได้รับการแก้ไขการหาประโยชน์ของคุณจะไม่ทำงานอีกต่อไป ดีกว่าเพียงแค่ส่งผู้ใช้ไปยังแอปการตั้งค่า
Edward Falk

1
ทำงานได้ดีใน Android 2.3.6 แต่ไม่ได้ทำงานกับ Android 4.0.3 ความคิดใด ๆ ที่จะเปิดหรือปิดการใช้งานใน Android 4.0.3
กฤษณะ

5
ฮ่าฮ่าฮ่า ... การหาประโยชน์นี้กลับมาอีกครั้งใน 4.2.2 แปลกใจที่ได้เห็น .. พระเจ้า!
amithgc

70

คำตอบเหล่านี้ไม่ได้รับอนุญาตในขณะนี้ นี่คือสิ่งที่ถูกต้อง:

สำหรับทุกคนที่ยังคงมองหาคำตอบ:

นี่คือวิธีที่ OLA Cabs และแอปอื่น ๆ กำลังทำอยู่

เพิ่มสิ่งนี้ใน onCreate ของคุณ

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

นี่คือวิธีการฝัง:

@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

}

นี่คือเอกสาร Androidสำหรับเดียวกัน

นี่คือการช่วยเหลือคนอื่นหากพวกเขายังคงดิ้นรน:

แก้ไข : การเพิ่มความคิดเห็นของ Irfan Raza สำหรับความช่วยเหลือเพิ่มเติม

@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 !!
Gurpreet

2
ต้องการการรวมกับไคลเอนต์ของ Google API ดังนั้นจึงมีเพียงโซลูชันสำหรับกรณีการใช้งานเฉพาะไม่เหมาะสำหรับโซลูชันทั่วไป
Cik

@DilroopSingh คุณประสบปัญหาอะไร ฉันใช้รหัสเดียวกันและทำงานได้อย่างสมบูรณ์
Akshat

1
เราสามารถทำสิ่งนี้ได้โดยไม่แสดงว่า builder เพราะฉันต้องเปิด gps โดยไม่แสดงการเตือนใด ๆ
Punithapriya

3
@Punithapriya ไม่สามารถทำได้ ต้องได้รับความยินยอมจากผู้ใช้และผู้สร้างนั้นจะต้องแสดง
Akshat

50

เปิดใช้งาน GPS:

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

ปิดใช้งาน GPS:

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

1
โดยอัตโนมัติ GPS จะเปิด / ปิด
Debugger

1
นอกจากนี้ยังช่วยในการเปิดใช้งาน private void turnGPSOn () {String provider = Settings.Secure.getString (getContentResolver (), Settings.Secure.LOCATION_PROVIDERS_ALLOWED); if (! provider.contain ("gps")) {// หากปิดการใช้งาน gps แล้ว 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); }}
ดีบักเกอร์

ใน android 2.3.4 ทำงานบน asamsung sII จะเปิดไอคอน gps โดยไม่ต้องเปิดใช้งานเซ็นเซอร์ gps อย่างมีประสิทธิภาพ แต่ถ้าคุณเลือกที่จะเปิดเซ็นเซอร์ GPS โดยทางโปรแกรมแล้วจะได้รับการยอมรับ
tony gil

24
android 4.0.4 - เปิดใช้งานการแจ้งเตือน gps เท่านั้น ไม่ใช่ gps เอง ดังนั้นดูเหมือนว่าจะเป็น แต่ในความเป็นจริงมันไม่ได้เป็น
อเล็กซ์

14
java.lang.SecurityException: การอนุญาตที่ถูกปฏิเสธ: ไม่ได้รับอนุญาตให้ส่ง android.location.GPS_ENABLED_CHANGE ออกอากาศ
Abhi

28

รหัสนี้ทำงานบนรากโทรศัพท์ถ้า app จะถูกย้ายไป /system/aps , และพวกเขามีสิทธิ์ต่อไปนี้ในที่ประจักษ์ :

<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 สำหรับการพูดถึงวิธีนี้ มันควรทำงานกับแอพระบบบนอุปกรณ์ที่ไม่ได้ทำการรูทเช่นกัน
AlexS

นี่เป็นวิธีที่ถูกต้อง ใช้งานได้กับ Android ทุกรุ่นไม่จำเป็นต้องมีเคล็ดลับ!
BQuadra

การปิด gps ไม่ทำงาน !! โปรดบอกฉันทีว่าทำไมและวิธีแก้ปัญหาที่เป็นไปได้
Shivansh

ตอนนี้ gps กำลังปิดและเปิดอย่างสมบูรณ์แบบ แต่ GPS ไม่ทำงานนั่นคือให้ตำแหน่ง lat long 0.0
Shivansh

<ใช้สิทธิ์ Android: ชื่อ = "android.permission.WRITE_SECURE_SETTINGS" /> เฉพาะสำหรับระบบ aps
sijo jose

23

แทนที่จะใช้เจตนา Settings.ACTION_LOCATION_SOURCE_SETTINGS คุณสามารถแสดงป๊อปอัพในแอพของคุณเช่น Google Map & บน Gps เมื่อคลิกปุ่มตกลงพวกเขาไม่จำเป็นต้องเปลี่ยนเส้นทางไปสู่การตั้งค่าเพียงแค่คุณต้องใช้รหัสของฉันเป็น

หมายเหตุ: บรรทัดของรหัสนี้จะเปิดกล่องโต้ตอบโดยอัตโนมัติหากไม่ได้เปิดตำแหน่ง บรรทัดนี้ใช้ใน Google แผนที่ด้วย

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

}
} 

หมายเหตุ: บรรทัดของรหัสนี้จะเปิดกล่องโต้ตอบโดยอัตโนมัติหากไม่ได้เปิดตำแหน่ง บรรทัดนี้ใช้ใน Google แผนที่ด้วย


1
รหัสนี้ใช้งานได้ดี แต่อย่าลืมสิทธิ์การใช้ตำแหน่งและขวด playervice ในไฟล์ gradle ...
Akash pasupathi

22

ตั้งแต่ Android เวอร์ชัน 4.4 คุณไม่สามารถเปิด / ปิดการใช้งาน gps แบบเป็นโปรแกรมได้ หากคุณลองใช้รหัสที่เสนอในคำตอบนี้จะมีข้อยกเว้นเกิดขึ้น

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

2
ดังนั้นมันเป็นความคิดเห็นหรืออื่น ๆ การแก้ปัญหาคืออะไร?
Shylendra Madda

@Shylendra Madda ไม่มีวิธีแก้ไขสำหรับการเปิดใช้งาน GPS คุณสามารถเรียกใช้กล่องโต้ตอบระบบที่เกี่ยวข้องเท่านั้น
เหลือเชื่อ ม.ค.

6

ในการเปิดหรือปิด GPS คุณต้อง 'เข้าถึง' และติดตั้ง BusyBox แม้แต่กับสิ่งเหล่านี้งานก็ไม่สำคัญ

ของตัวอย่างที่นี่: Google ไดรฟ์ , Github , Sourceforge

ทดสอบกับ Android 2.3.5 และ 4.1.2


ตัวอย่างไม่สามารถใช้งานได้อีกต่อไป
นักพัฒนา android

นี่คือข้อมูลล่าสุด: rapidshare.com/files/1458124346/GPSToggler-20130222.7z ฉันลบเวอร์ชันเก่าออกโดยไม่ได้ตั้งใจ BusyBox ไม่จำเป็นอีกต่อไป
OGP

ยังไม่พร้อมใช้งาน อาจใช้บริการอัปโหลดไฟล์อื่น
นักพัฒนา android

ฉันทำให้โฟลเดอร์เป็นแบบสาธารณะและยืนยันแล้ว ตอนนี้มันสามารถดาวน์โหลดได้ นอกจากนี้ยัง FTP ส่วนตัวของฉันที่นี่: StackExchange: se@oldgopher.gotdns.com
OGP


5

คำตอบที่ถูกต้องข้างต้นเก่ามากมันต้องการสิ่งใหม่ดังนั้นนี่คือคำตอบ

ในการอัปเดตครั้งล่าสุดเรามีการสนับสนุน androidx ก่อนอื่นให้รวมการพึ่งพาในไฟล์ build.gradle ระดับแอปของคุณ

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

จากนั้นเพิ่มในไฟล์รายการของคุณ:

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

อย่าลืมรับความยินยอมจากผู้ใช้สำหรับการอนุญาตเหล่านี้หากคุณกำลังปล่อย

ตอนนี้ที่นี่คือรหัสเพียงใช้

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

หากมีบางอย่างผิดปกติโปรดปิงฉัน


2

คำตอบได้รับการพัฒนาในคำถามอื่น แต่ถูกปิดและฉันต้องการให้ชุมชนลองใช้ด้วย

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

ดูความคิดเห็นนี้

การแก้ปัญหานี้จะต้องมีWRITE_SETTINGSและWRITE_SECURE_SETTINGSสิทธิ์


@milind สมมติว่าฉันมีอุปกรณ์ที่รูทฉันควรทำอย่างไรในการใช้รหัสนี้ ฉันพยายามรับสิทธิ์รูทสำหรับแอพ แต่ไม่ได้ช่วย มันพูดว่า "การปฏิเสธสิทธิ์: เขียนเพื่อการตั้งค่าความปลอดภัยต้อง android.permission.WRITE_SECURE_SETTINGS"
นักพัฒนา Android

@android อ่านประโยคสุดท้ายของโพสต์นี้ การใช้วิธีนี้จะต้องandroid.permission.WRITE_SECURE_SETTINGSได้รับอนุญาตในรายการ
gobernador

1
ฉันรู้ว่า . ฉันได้เพิ่มไปแล้ว มันบอกฉันว่าแม้มันจะอยู่ในรายการ
นักพัฒนา android


ดังนั้นมันจึงเป็นไปไม่ได้แม้แต่กับอุปกรณ์ที่รูทเครื่อง!
นักพัฒนา android

2

android.server.LocationManagerServiceอาจจะมีเทคนิคการสะท้อนรอบชั้นเรียน

นอกจากนี้ยังมีวิธีการ (ตั้งแต่ API 8) android.provider.Settings.Secure.setLocationProviderEnabled


3
Settings.Secureคลาสนี้ดูเหมือนจะมีแนวโน้ม แต่ฉันได้รับข้อยกเว้นด้านความปลอดภัยบอกว่าฉันต้องการ android.permission.WRITE_SECURE_SETTINGS และฉันยังคงได้รับข้อผิดพลาดแม้จะเพิ่มการอนุญาตนี้ (และ WRITE_SETTINGS ด้วย) ในรายการของฉัน แต่ดูเหมือนจะเป็นวิธีที่ดีในการค้นหาต่อไป ขอบคุณ :)
Maid450

WRITE_SECURE_SETTINGSมีระดับการป้องกันที่systemOrSignatureคุณต้องการเพื่อให้แอปนั้นเป็นแอประบบเพื่อให้ทำงานได้ซึ่งกล่าวถึงในคำตอบนี้ด้วย
Flow

2

Google Developersนี่คือทางออกที่ดีที่สุดให้โดย เพียง แต่เรียกวิธีการนี้ใน onResume ของ onCreate 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)));
    }
}

หมายเหตุ:บรรทัดของรหัสนี้โดยอัตโนมัติเปิดกล่องโต้ตอบถ้าLocationไม่ได้อยู่ บรรทัดนี้ใช้ใน Google แผนที่ด้วย

 status.startResolutionForResult(
 MainActivity.this,
 PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);

mLocationPermissionGrantedคืออะไร
b devloper

เพื่อตรวจสอบว่าได้รับอนุญาตหรือไม่สำหรับตำแหน่ง นี่คือการrun timeอนุญาตที่ได้รับอนุญาต
AMAN SINGH

คุณสามารถผ่านไปได้โดยการตั้งค่าจริงถ้าคุณได้รับอนุญาตจากอุปกรณ์pre-lollipop แล้ว
AMAN SINGH

2

รหัสนี้ใช้ได้กับโทรศัพท์ที่ฝังราก:

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

สำหรับการปิด GPS คุณสามารถใช้คำสั่งนี้แทน

settings put secure location_providers_allowed -gps

คุณยังสามารถสลับความแม่นยำของเครือข่ายโดยใช้คำสั่งต่อไปนี้: สำหรับการเปิดใช้งาน:

settings put secure location_providers_allowed +network

และสำหรับการปิดคุณสามารถใช้:

settings put secure location_providers_allowed -network

1

สิ่งต่าง ๆ มีการเปลี่ยนแปลงนับตั้งแต่มีการโพสต์คำถามตอนนี้ด้วย Google Services API ใหม่คุณสามารถแจ้งให้ผู้ใช้เปิดใช้งาน GPS:

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

คุณจะต้องขอสิทธิ์ ACCESS_FINE_LOCATION ในรายการของคุณ:

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

ดูวิดีโอนี้ด้วย:

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


ขอบคุณ แต่ Google Play Services 7 สามารถใช้กับ android รุ่นเก่าได้หรือไม่ (API 14 - 23)
JCarlosR

1

อันนี้ใช้ได้สำหรับฉัน

มันง่ายกว่าดังนั้นคำตอบของ Rj0078 ในคำถามนี้ ( https://stackoverflow.com/a/42556648/11211963 ) แต่ก็ใช้ได้เช่นกัน

มันแสดงกล่องโต้ตอบเช่นนี้:

ป้อนคำอธิบายรูปภาพที่นี่

(เขียนเป็น 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
            }
        }
    }


-1

ใช้รหัสนี้ง่ายและง่ายต่อการเข้าถึง:

สิทธิ์:

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

ปฏิบัติตามรหัสนี้เพื่อเข้าถึง GPS โดยทางโปรแกรม:

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);
} 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.