首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Android上以编程方式启用或禁用GPS?

如何在Android上以编程方式启用或禁用GPS?
EN

Stack Overflow用户
提问于 2011-01-18 15:23:04
回答 18查看 309.4K关注 0票数 168

我知道在android has been discussed many times上程序化打开/关闭GPS的问题,答案总是一样的:

“出于安全/隐私原因,您不能,您必须转发到位置首选项屏幕,并让用户启用/禁用它。”

据我所知,我最近从市场上买了Tasker,而且,在你可以用它完成的许多其他事情中,你可以设置规则,在进入预定的应用程序时自动启用GPS,在退出时禁用它(有关如何做到这一点的教程,请参阅here,它非常有效!)而且这个应用程序不能用固件签名密钥签名,因为它可以在许多android版本和不同的设备上工作,你甚至不需要根。

我想在我的应用程序中做到这一点。当然,我不想破坏用户的隐私,所以我首先会问用户是否想用典型的“记住我的决定”复选框自动打开它,如果他回答是,就启用它。

有谁知道Tasker是如何做到这一点的吗?

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2011-03-15 07:26:50

可以通过exploiting切换GPS,这是电源管理器小部件中的一个bug。请参阅此xda thread进行讨论。

下面是我使用的一些示例代码

代码语言:javascript
复制
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);
    }
}

使用以下命令测试电源控制小部件的现有版本是否允许您切换gps。

代码语言:javascript
复制
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
}
票数 160
EN

Stack Overflow用户

发布于 2015-11-06 06:09:38

所有这些答案现在都是不允许的。下面是正确的一条:

对于那些仍在寻找答案的人:

以下是OLA Cabs和其他类似应用程序如何做到这一点。

将此添加到您的onCreate中

代码语言:javascript
复制
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;
            }
        }
    });
}

以下是实现的方法:

代码语言:javascript
复制
@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 Documentation

这是为了帮助其他人,如果他们还在挣扎:

编辑:添加Irfan Raza的评论以获得更多帮助。

代码语言:javascript
复制
@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 
         } 
    } 
} 
票数 75
EN

Stack Overflow用户

发布于 2012-07-16 19:14:36

启用GPS:

代码语言:javascript
复制
Intent intent=new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", true);
sendBroadcast(intent);

禁用GPS:

代码语言:javascript
复制
Intent intent = new Intent("android.location.GPS_ENABLED_CHANGE");
intent.putExtra("enabled", false);
sendBroadcast(intent);
票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4721449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档