如何提示用户启用GPS

时间:2012-11-18 01:02:17

标签: android android-layout android-mapview android-maps

Hello stackoverflow的世界,

这是我在这里的第一篇文章。

我是Android界的新手,所以如果我在网上查看不同的教程,我在打开自己的地图时必须出现的启用GPS设置有问题。

我尝试过以下代码:Android get location or prompt to enable location service if disabled

Button gpsButton = (Button)this.findViewById(R.id.buttonGPSLocation);
gpsButton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
    // Start loction service
    LocationManager locationManager = (LocationManager)[OUTERCLASS].this.getSystemService(Context.LOCATION_SERVICE);

    Criteria locationCritera = new Criteria();
    locationCritera.setAccuracy(Criteria.ACCURACY_COARSE);
    locationCritera.setAltitudeRequired(false);
    locationCritera.setBearingRequired(false);
    locationCritera.setCostAllowed(true);
    locationCritera.setPowerRequirement(Criteria.NO_REQUIREMENT);

    String providerName = locationManager.getBestProvider(locationCritera, true);

    if (providerName != null && locationManager.isProviderEnabled(providerName)) {
        // Provider is enabled
        locationManager.requestLocationUpdates(providerName, 20000, 100, [OUTERCLASS].this.locationListener);
    } else {
        // Provider not enabled, prompt user to enable it
        Toast.makeText([OUTERCLASS].this, R.string.please_turn_on_gps, Toast.LENGTH_LONG).show();
        Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        [OUTERCLASS].this.startActivity(myIntent);
    }
}
});

但我收到了一些错误,也许是因为我也无法理解它!

这是我的问题:

  • 为什么需要声明一个Button(gpsButton)以及我在哪里/如何创建它?
  • 代码可以在MapActivity类之后整体推出,还是必须在第一次onCreate之后推出?
  • 什么是OUTERCLASS?
  • Manifest的一部分权限(我已经拥有)我要在Layout上更改一些内容吗?

因此,一般来说,有人可以更好地向我解释如何使用此代码以及我需要做什么修改。

如果您需要,我可以发送我的整个Java代码。

提前感谢您的可用性。

关于,

克劳迪奥

1 个答案:

答案 0 :(得分:1)

嗯,你这里有几个问题。

  

为什么需要声明一个Button(gpsButton)以及我在哪里/如何创建它?

如果要创建按钮,则可以在Activity使用的XML布局中声明它,也可以在代码中添加它。如果您只是粘贴某些示例中的代码,您将需要了解此代码实际上是通过它的id在当前视图中找到它而形成对该对象的引用(即当前正在显示的布局)。因此,如果您还没有在XML中的某处创建一个id为buttonGPSLocation的按钮,那么此代码将无效。至于为什么有必要:似乎样本的作者决定提示用户点击按钮以打开手机设置并启用GPS。

  

代码可以在MapActivity类之后整体推出,还是必须在第一次onCreate之后推出?

这个问题不是很清楚(可能是这里的语言问题),但如果您发布所有相关代码,它可能会有所帮助。通常,设置onClickListeners可能应该在您的Activity的onCreate中完成。是否在MapActivity内部完成取决​​于您未提供给我们的更多信息。

  

什么是OUTERCLASS?

在Java中,您可以在另一个类中定义一个类。我们通常将类定义为“顶级”类,即一些文件名SomeClass.java,其内容看起来像

public class SomeClass {
//some code
}

现在,当您在另一个类中定义一个类时,“嵌套”类是另一个类的内部,反之亦然。所以包含嵌套类的那个是“外部”类。

class OuterClass {
    ...
    class NestedClass {
        ...
    }
}

为什么这一切都很重要?好吧,因为有一些关于外部类和嵌套类之间的工作方式的规则。在您的情况下,当您在按钮上设置onClickListener时,最相关的事实是,您实际在做的是将引用传递给OnClickListener类的实例。在Java中,您可以创建一个匿名内部类,这意味着不是定义一些实现onClickListener的顶级类(顺便说一句,您可以轻松地通过让所有这些发生的类简单地声明它实现onClickListener接口) ,例如public class WhateverMyClassNameIs extends Activity implements View.OnClickListener)你实际上只是创建一个未命名的,onClickListener实例,由于你没有声明对它的引用,因此无法在其他任何地方引用它。现在,问题在于这个onClicklistener实例内部,当你想现在引用它所定义的外部类(在你的情况下,是Activity类)时,你不能再使用“this”了,因为“this”实际上是onClickListener,因为“范围”的工作方式。换句话说,OnClickListener没有名为“startActivity”的方法;只有一个Activity类(或者你的类扩展了Activity)。所以你必须使用所谓的“合格的”来澄清你打算引用“外类”,这就是你需要*MyActivity*.this.startActivity...

的原因
  

Manifest(我已经拥有)的一部分许可我要改变   布局上的东西?

清单和布局文件是两个完全不同的东西。它们都是使用XML定义的,但它们完全不同。除其他外,清单包含应用程序请求的所有活动类和权限的声明等。布局文件是活动(UI)中使用的实际布局。它们应位于res / layout中,您可以在那里定义任何您想要的内容。当你需要让那个UI“活着”时,你必须在代码中的Activity里面获取对你的小部件(按钮,文本视图)等的引用,然后在那里做你想做的事。