好的,安卓,广播我的位置!

  • 下载MyLocation.rar - 194.4 KB
  • 下载MyLocation.zip - 567.6 KB

介绍和背景 所以,我必须承认我的MCS类(遥远)大学,和我的父母总是强迫我送他们一个短信或电话通知他们我的当前位置,我在哪里,什么是当前统计数据,是否我有公共汽车等等。这并不是一个问题,问题是我经常听阿姆,所以我忘记告诉他们我在哪里等等。 为了解开这个谜题,我想我应该让我的Android对我自己有用一点,并通过短信通知我的父母,我现在在哪里!本文不仅专注于开发一个简单的应用程序,但也关注LocationManager时,LocationListener, PendingIntent和其他一些概念在Android编程,您可能想知道建立其他类似需要GPS的应用程序或基于网络的位置服务和通知客户又是; 该应用程序还使用SmsManager,该服务为您提供使用客户端网络发送SMS消息的功能,应用费率。我希望这篇文章会引起你的兴趣,它可能会吸引你。: -), 但这篇文章是另外一回事,这篇文章是解释在Android设备中使用位置api的方法。Android设备充满力量和潜力!位置api不仅仅用于定位你的朋友的地图和服务中,位置api被提供给你用于任何目的,因为它是你的工作来确定和做你想做的事情。和我一样,我使用了位置更新,并在短信中使用,通过网络广播给我的朋友和家人。这篇文章只是解释了其中的一小部分,如果你决定的话。把它想象成乐高积木,去玩帖子吧!: -) 建设和概念 这个应用程序的概念就像侦听器和广播器一样简单,尽管不会使用直接广播,但其概念与此类似。此外,一旦我们完成了,我们将能够插入SmsManager到我们的应用程序发送SMS消息到我们感兴趣的。 这里是: LocationManager用于管理位置感知应用程序需要的所有内容。一个侦听器,它可以在我们的应用程序收到关于位置更改的通知时执行代码。现在这一点又分为两个部分,稍后我会详细讨论。一个被触发并通知客户端的对象。对象可以是任何东西,在我的例子中,我将使用SmsManager发送SMS消息给我想要接收这些通知的人。 通过这种方式,我将能够广播位置更新给那些我希望得到通知的人。 图1:我们的需求和工作的演示。解释演示中发生了什么以及使用了什么对象。 由于这是一个一般的和单元的概述,您可以轻松地更改实现来满足您自己的需要。例如,您可以更改通知客户机的方式。您可以删除SmsManager并实现您自己的API、将详细信息发送到在线云、传输到web服务、将位置存储在您自己的设备上等等!这是本文的一个很好的方面,因为我不会在一个活动中硬编码所有内容,而是尝试为您提供多个服务类和函数,它们可以移植到其他用途、其他函数、其他服务和其他实现。 阅读本文的其余部分,看看在你的Android应用程序中实现位置感知是多么容易,与客户端共享数据是多么容易,或者做任何你想做的事情是多么容易。 理解Android位置api 首先,我想教你一些关于Android位置api的基础知识。位置API从一开始就被添加到Android设备中,不是API 1,而是后来的几个版本。位置api包括提供程序对象、管理器、地址、地理编码器等等。它们都被分类在一个类似的包下,开发人员可以在他们的应用程序中使用它们,以更好地利用应用程序中的位置服务并开发位置感知应用程序。有没有想过,导航应用程序是如何工作的?继续思考,或者继续阅读这篇文章。 Android api是基于Java编程语言的,所以这些api的概念与Java api的概念相似。包、对象、管理器,然后是监听器。在c#的平行世界中,有名称空间、对象、事件和处理程序……我希望你们已经了解了LocationManager和LocationListener是什么? LocationManager是位置API中的一个特殊对象,它保存位置提供者的信息、位置细节、检查位置的最小时间跨度和一些其他东西。另一方面,LocationListener是侦听器,处理程序,也就是tr当更新准备好定位时,igched。简单地说,对你来说:LocationManagers被请求为位置变化提供更新,并且LocationListener对象被传递,它将处理位置的变化。locationlistener只对位置更新时执行感兴趣。它们并不是一直都在引用GPS (GPS必须定期关闭以节省电池),而是会每1分钟捕捉位置更新,或者当用户向任何方向移动100米后。通过这种方式,你可以在应用程序中获得用户已经从之前位置转移的通知,然后你可以继续对新位置做任何你想做的事情。 下面是绘图,在下面的部分中,我将讨论这几个对象,然后继续讨论应用程序的编程部分。我希望,我清楚这些技术方面的Android位置API编程。 LocationManager描述 首先是LocationManager对象,无论你在构建什么类型的应用,无论你期望如何使用位置,你总是会在你的应用中使用LocationManager对象。LocationManager对象是在Android core中构建的,你可以将它们用作系统定义的服务。要使用此服务,您需要首先访问权限,在您的清单文件中输入以下内容: 隐藏,复制Code

LocationManager为您提供了两种类型的位置: ACCESS_COARSE_LOCATION的近似位置(精确度接近200英尺)。定位准确(精度为20英尺),ACCESS_FINE_LOCATION。 大多数情况下,您应该考虑使用ACCESS_FINE_LOCATION,但是如果您的应用程序想要访问精度较低的位置,您可以考虑使用ACCESS_COARSE_LOCATION类型。除了精度之外,它们对电池电量的要求也有差异。 要创建这个对象的新实例,您不需要对它调用new操作符,而是调用getSystemService,然后将其cast给LocationManager。例如,, 隐藏,复制Code

LocationManager manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

这将允许您使用在应用程序中持有其引用的manager对象。然后你也可以请求位置更新。 请求位置更新 这是一个有点棘手的概念,因为它也取决于您的应用程序的架构和设计。你不会使用LocationListener如果你的应用程序不是在后台运行,就像在一个独立的工作线程上持续执行。当应用程序关闭时,locationlistener将被删除。为此,引入了等待意图来捕获位置更新。 所使用的函数与此类似,但被重载,可以接受这两种对象中的任何一种。现在,您的职责是确定哪个选项适合捕获位置更新的需要。当用户从一个位置移动到另一个位置时,休眠的应用程序将无法捕获更新,你可能会错过用户的更新,在这种情况下,PendingIntent对象会有所帮助。它可以在自己单独的线程上执行,因此你可以允许LocationManager使用一个PendingIntent来代表你执行动作。 信息:如果你读过Android文档,你会知道一个PendingIntent是一种特殊的Intent。它是一个意图,不需要你的应用是活动的,为了执行一些动作,你创建一个意图,并将它传递给系统,这样系统就能代表你完成工作,就像你在做那个工作一样!PendingIntent类似于令牌、访问键,您将其授予其他应用程序或框架,它们使用它们来模拟您的应用程序。 隐藏,复制Code

manager.requestLocationUpdate(PROVIDER, minMinutes, minMeters, handler);

在这两种情况下,处理更新的代码是相同的,现在您应该了解这些变量是什么。 提供者 作为一名Java开发人员,您可能会想到一个“字符串”常量会出现在这里。这些提供程序的内置值是, LocationManager。提供对使用GPS卫星的位置服务的访问。LocationManager。NETWORK_PROVIDER,使用网络提供位置服务。与GPS卫星相比,所提供的定位精度较低。 minMinutes 你可以控制LocationManager用位置更新更新处理器的频率。将其设置为大于0的值,以便在一段时间后得到通知。其值以分钟为单位。minMeters 另一个旗帜得到通知,只有当用户已经移动了几米,从他以前的位置。如果你想在100米或1000米(1公里)后通知他们,这很有用。处理程序 这是一个概念性的观点,你们要理解它。处理程序只是当更新准备好让应用程序处理时触发的代码。 处理器有两种形状和大小, 位置侦听器pendingintent 处理程序的细节将在下一节中讨论。到目前为止,必须清楚LocationManager是什么以及它为我们提供了什么。 LocationListener描述 首先,我想解释一下LocationListener对象,以及如何在LocationManager中使用它来接收位置变化的更新。LocationListener只是一个拥有处理程序(函数)的接口,你可以在自己的应用程序中使用它来处理位置更新。就像任何其他接口一样,您实现它,然后覆盖它所具有的函数! 现在,例如,您创建了一个新的Java类SampleListener,并实现了LocationListener,您将拥有4个额外的函数,它们允许您在应用程序中管理位置服务。看看下面的代码: 隐藏,收缩,复制Code

package com.afzaalahmadzeeshan.mylocation; // Package name

// Some required imports
import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;

// Entire class structure with empty functions.
public class SampleListener implements LocationListener {
    @Override
    public void onLocationChanged(Location location) {
        // Gets executed once location change has been notified to application.
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // Status of location provider has been changed
    }

    @Override
    public void onProviderEnabled(String provider) {
        // Provider enabled by user
    }

    @Override
    public void onProviderDisabled(String provider) {
        // Opposite of onProviderEnabled(String)
    }
}

现在,对这些函数进行一点解释就足以满足本节的目的了。在我继续之前,LocationListener的目的只是接收LocationManager关于用户位置变化的通知,没有别的! onLocationChanged(位置) 这是上面可用函数列表中的第一个函数,我们可以使用它来获得位置API更改的通知。该函数为我们提供了用户当前持有的新位置,新位置作为参数传递给我们的函数。 每当应用程序有更新可用时,就会执行此函数。您可以使用它作为应用程序业务逻辑的基础,并执行这里的任务,如重新绘制UI、更新数据库等等。onStatusChanged(字符串、整数、包) 当提供程序的状态从可用变为不可用等等时,将执行此函数。函数传递了有关提供者、状态码和其他细节的信息,这些信息可能有助于处理更改。 提供者 如前所述,提供者是位置api的服务提供者。它可以是GPS_PROVIDER,也可以是为您提供位置服务的其他提供者。它可以帮助您查明是哪个提供商更改了状态,以便您能够适当地处理该更改。状态 这个参数决定它现在的状态。与提供程序一起,它将让您发现此时哪个提供程序是活动的,哪个是关闭的。它有以下值,使用它你可以决定你的应用程序应该如何继续接收更新,如果没有一个是可用的,那么它必须通知用户关于场景: out_of_service temporarily_unavailable可用 临时演员 如前所述,在这个函数中任何其他可能有帮助的细节都会在传递给这个函数时添加到Android Bundle中。 onProviderEnabled(字符串) 这个(以及后面的函数)是由用户交互触发的。例如,当用户手动启用提供者时。您可以使用此函数重新激活服务并继续处理位置更新。onProviderDisabled(字符串) 与前一种方法一样,当用户交互发生且提供者被禁用时,也会触发此方法。使用它来禁用应用程序中的定位服务。 通过这种方式,您可以管理如何获得更新以及在任何更改时发生什么。LocationListener是处理位置更新的一种非常简单和有效的方法。但是,等等,这也有一个缺点。使用LocationListener处理位置更新,你的应用程序需要是可见的和活动的,一旦你的应用程序被删除,监听器也被删除,所以你不能捕获位置活动从后台,像一个服务。 换句话说,你的应用程序不再是一个位置捕获服务,而是一个“当前位置查看器”类型的应用程序。如果是这样,那么这个侦听器对你来说就足够了!但是,如果你想获得更新时,你的应用程序没有运行或在后台,并且主工作线程可能不可用,然后阅读下一节PendingIntent。对于后台服务,PendingIntent工作得很完美,即使你的应用程序关闭了,它也能提供更新,因为PendingIntent是在自己的线程上执行的。 PendingIntent描述 现在,我将指出如何使用PendingIntent和这个管理器,并在应用程序中捕获位置更新。在上一节中,您学习了如何使用侦听器,在这一节中,您将使用服务,然后接收后台服务上的更新,这些服务不需要您的应用程序在用户面前总是处于活动状态。 创建一个服务 第一步是创建一个服务,并编写在更新就绪供应用程序使用时需要处理的逻辑。我们需要在应用程序中创建一个IntentService。IntentService允许我们有一个功能,在其中我们可以编写每次服务启动时执行的逻辑代码。通过扩展对象,您可以获得该对象中具有的相同特性。将本文与源代码连接起来,我创建了一个服务并将其命名为“BroadcastLocationService”,它正在扩展IntentService。 隐藏,复制Code

package com.afzaalahmadzeeshan.mylocation;

import android.app.IntentService;
import android.content.Intent;
import android.content.Context;
import android.location.Location;

public class BroadcastLocationService extends IntentService {

    public BroadcastLocationService() {
        super("BroadcastLocationService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        sendMessage(getApplicationContext(), 
                    new LocationService(getApplicationContext()).getLocation());
    }

    private void sendMessage(Context mContext, Location location) {
        // Code here to broadcast the location
    }
}

在我们的应用程序的上述类中,我们有两个函数。一个是继承的,另一个是自定义的,我们是自己创造的。现在,考虑一下,当一个新请求被发送到此服务以执行时,它将执行onHandleIntent(Intent)函数下的代码。需要处理的意图作为一个参数传递。 这个意图是如何通过的,你将在下一步学习。如果你还不知道什么是挂起意图,下一部分会告诉你,所以继续阅读。 创建运行服务的意图 我们可以在后台创建一个意图来执行服务并为我们的应用程序执行工作。注意,用户不再需要在他们的设备上激活屏幕来使用这种方法捕捉位置更新。 隐藏,复制Code

Intent intent = new Intent(getApplicationContext(), BroadcastLocationService.class);

上面这条线足以创建需要在位置更新出现时触发的意图。但这还不够,我们现在需要为这个意图创建一个挂起的意图,并等待管理器向我们提供服务和更新,因为它们是可用的。 要创建一个新的悬挂意图,请写下以下内容。 隐藏,复制Code

PendingIntent pIntent = PendingIntent.getService(
                            getApplicationContext(), // Get the context
                            0,                       // Request code
                            intent,                  // The intent we created
                            FLAG_CANCEL_CURRENT      // A flag
                        );

这就为我们创建了一个PendingIntent令牌,我们可以将其传递给其他应用程序、服务或对象,当我们需要触发它时,它们可以代表我们执行它。 收到的更新 现在,同样的话题…现在,我们将把pIntent传递给管理器,并在服务中等待,直到位置更新可用。同样的代码也可以在这个场景中工作,但是最后一个参数. 有所不同。 隐藏,复制Code

manager.requestLocationUpdates(GPS_PROVIDER, 10, 1000, pIntent);

例如,在上面的代码中,我在10分钟后从GPS_PROVIDER访问位置更新,只有当用户移动了1000米;1公里。如果是这种情况,那么pIntent将被触发,这将调用onHandleIntent函数并允许我们处理位置并做我们想做的事情。 一点点SmsManager 尽管本文不打算重点介绍硬编码的应用程序,但旨在为您提供广播位置更新的概述。SmsManager只是可以使用的此类API的一个示例。您可以创建自己的服务、API库等等来广播位置。前面的部分将保持不变,这只是你希望你的位置被共享的方式。 获取SmsManager的实例 要获得SmsManager的实例,您调用以下代码: 隐藏,复制Code

SmsManager manager = SmsManager.getDefault();

一旦完成,您可以发送文本消息或多媒体消息!这也非常容易,只要传递目的地号码,短信,你就可以走了。但为此,您的申请需要获得以下许可, 隐藏,复制Code

它将允许您的应用程序发送消息。 编写应用程序 在写这一部分的时候,我在想该写些什么,因为主要内容已经讨论过了。在本节中,我将向您展示如何匹配所有内容并创建一个运行的Android应用程序。第一步是创建一个管理器,并允许用户输入服务更新的详细信息。我们需要允许用户能够向我们提供这些值,在我的应用程序中,我已经创建了2个EditText字段来获得这些值,否则我已经为标志设置了一些默认值。 图2:用于时间间隔和最小移动米的主页输入字段。 此外,我们希望用户能够控制服务何时运行,何时关闭。这样他就可以管理资源何时被使用,何时不被浪费。GPS,短信和所有类似的资源也消耗电池,电池也是一种资源,必须明智地考虑。因此,我已经创建了另一个复选框对象来持有用于激活或停用服务的键。 图3:在主活动上禁用服务接口。 它也是一个很好的用户体验,可以向用户展示服务的详细信息以及应用程序中正在进行的工作。例如,我们将发送位置更新到一些联系人,并基于一些检查。所以明智的做法是在屏幕上显示这些细节。就像下面这个, 图4:Android应用程序显示了我们服务的详细信息。 上面Android UI的XML是这样的。 隐藏,收缩,复制Code



    

    

    

    

    

    

    

    

    

上面的Android UI很有用,因为它包含了已经设置好的UI组件,然后我们可以使用相同的UI并从后面的代码更改视图因为我们需要改变它。 管理数据源 在Android中,您在SQLite数据库中管理数据。它们是默认提供的非常小而紧凑的数据库,你可以有效地使用和存储你的数据。 我使用了相同的东西,创建表和数据库的东西,并提供了一些函数,我可以执行从外部世界!我不希望外部对象直接调用函数并在数据库上执行命令。这就是为什么我将所有内容隐藏起来,并为CRUD操作提供公共函数。 在本节中,要在应用程序中实现SQLite数据库功能,只需要了解两个类。 SQLiteOpenHelper类basecolumns接口 1. SQLiteOpenHelper类 这个类为我们提供了在实际模仿SQL引擎时可能需要的函数和其他资源。允许我们管理SQL数据库和与这些数据库的连接。为我们提供了创建数据库,升级数据库或删除数据库所需的功能。 这里有许多函数,我只想讨论一个函数,onCreate(SQLiteDatabase)。创建数据库时调用此函数。您需要处理这个函数并编写SQL命令来创建表并为数据库中的对象设计模式。该函数只被调用一次!所以请务必记住模式,因为要更改模式,您需要删除以前的数据库并重新创建它们。 onCreate(SQLiteDatabase)函数中的示例代码如下所示 隐藏,复制Code

private final static String COMMAND = "CREATE TABLE " + TABLE_NAME + 
                                      "(" + 
                                          _ID + " INTEGER PRIMARY KEY, " +
                                          COLUMN_ONE + " TEXT," + 
                                          COLUMN_TWO + " TEXT" +
                                      ")";

@Override
public void onCreate(SQLiteDatabase db) {
   // Execute the codes here...
   db.execSQL(COMMAND);
}

上面的代码一旦执行,就创建一个表和其中的三列。您可以执行多个命令在其中创建多个列,等等。要了解更多关于SQL命令的信息,我建议您学习SQL语言! 2. BaseColumns接口 这里没有什么需要理解的!它只是将另一个成员_ID添加到游标对象可能期望的对象中。在上面的代码中,_ID来自这个接口。 隐藏,复制Code

public class MyClass extends SQLiteOpenHelper implements BaseColumns {
    /*
     * The code comes here to manage the SQL databases.
     * The functions as discussed also need to be implemented to trigger our own logic each time a database needs to be created.
     */
}

我还使用了相同的方法来创建数据库并存储每个项的值。它包含在样本中! 捕获的位置 如前所述,应用程序的逻辑基于后端服务,后端服务运行并捕获位置并将位置发送给联系人。这就是应用程序不需要为每个组件都有UI的原因。我们的应用程序包含不需要UI、IntentService、SmsManager等的服务和其他后台进程,它们不需要UI。构建一个UI不会引起太多问题,但为什么要浪费另一个可以在基本类中触发函数的活动呢! 我写了相同的Java类,它做所有的应用程序。它捕获这个位置,然后触发广播器来广播这个位置。 隐藏,收缩,复制Code

package com.afzaalahmadzeeshan.mylocation;

import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.*;
import android.provider.Settings;

public class LocationService {

    private Context mContext;
    private Location mLocation;
    private LocationManager locationManager;
    private PendingIntent intent;

    private static long distance;
    private static long minutes;

    public LocationService(Context context) {
        mContext = context;

        // Set up to capture the location updates
        Intent smsIntent = new Intent(mContext, BroadcastLocationService.class);
        intent = PendingIntent.getService(mContext, 0, smsIntent, 0);
    }

    public static long getDistance() {
        return distance;
    }

    public static long getMinutes() {
        return minutes;
    }

    public void cancelUpdates() {
        if(locationManager != null) {
            locationManager.removeUpdates(intent);
        }
    }

    public Location getLocation() {
        locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);

        // Check if the tracking is enabled.
        boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (!isGPSEnabled && !isNetworkEnabled) {
            // Prompt to get the settings enabled by the user.
            showSettingsDialog();
        } else {
            // Either one is enabled
            // 10 * 60 * 1000 = 10 minutes
            // 1000 = 1 km
            // this = listener

            if (isGPSEnabled) {
                // Get the location from GPS
                try {
                    locationManager.requestLocationUpdates(
                            LocationManager.GPS_PROVIDER,
                            getMinutes() * 1000 * 60,
                            getDistance(),
                            intent);

                    if(mLocation == null) {
                        mLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    }
                } catch (SecurityException e) {
                    showSettingsDialog();
                }
            } else {
                // Get the location from GPS
                try {
                    // Set up to capture the location updates
                    Intent smsIntent = new Intent(mContext, BroadcastLocationService.class);
                    PendingIntent intent = PendingIntent.getService(mContext, 0, smsIntent, 0);

                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            getMinutes() * 1000 * 60,
                            getDistance(),
                            intent);

                    if(mLocation == null) {
                        mLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    }
                } catch (SecurityException e) {
                    showSettingsDialog();
                }
            }
        }

        return mLocation;
    }

    public void showSettingsDialog() {
        new AlertDialog.Builder(mContext)
                .setTitle("Enable GPS")
                .setMessage("Enable GPS in your settings for receiving active location details.")
                .setNegativeButton("Cancel", null)
                .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        mContext.startActivity(intent);
                    }
                })
                .create().show();
    }
}

这段代码在后台运行,我们的home activity使用这里可用的函数来执行操作并获取关于位置管理器和位置api的详细信息。 广播的位置 最后一个阶段是实际广播位置,我使用SmsManager来达到这个目的!下面的代码完成了这个。  隐藏,收缩,复制Code

package com.afzaalahmadzeeshan.mylocation;

import android.content.Context;
import android.telephony.SmsManager;

import java.util.ArrayList;

public class SmsService {
    public static boolean sendMessage(Context context, String location) {
        boolean result = false;
        try {
            SmsManager manager = SmsManager.getDefault();
            String message;

            // Get the string
            message = "[AUTOMATIC MESSAGE]\n" + "I am currently at " + location + " (approximately; accuracy within 100 meters).";

            ArrayList numbers = new ContentManager(context).getNumbers();
            if(numbers != null && numbers.size() > 0) {
                for (Number number : numbers) {
                    String telNumber = number.getNumber();
                    manager.sendTextMessage(telNumber, null, message, null, null);
                }
                result = true;
            }
        } catch (Exception ignored) {

        }
        return result;
    }
}

以上代码为我们完成了工作。如果你能看到,它会得到我们想要通知的联系人列表,然后循环发送消息给他们每个人基于位置。所以这是我们的工作! 好处:处理错误和良好的实践 现在,我可以分享一些关于错误和糟糕的应用程序代码的个人经验,这样一旦你开始为你的客户编写应用程序,你就不会重复同样的问题,设计可能会被实现到最好的水平。 1. 表没有找到 应用程序中可能出现的第一个错误是“未找到表”。这在你的应用程序中是合法的错误,是一个原因,你可能想要创建的表,最初创建数据库,(表)没有创建,现在无法创建,直到你删除之前的数据库,并重新执行onCreate函数。 要解决这个问题,可以在开发环境中删除数据,然后重新执行应用程序。但是记住,一定要创建表,并在数据库的onCreate函数中定义模式。 2. 供应商没有 由于我们的应用程序依赖于位置提供者,我们需要确保在我们开始从应用程序中锁定位置之前,它们是可用的,并得到关于用户位置的其他变化的通知。您可以使用manager获取位置服务和提供商。 以下代码为例,确定是否启用了GPS的提供者: 隐藏,复制Code

boolean isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);

你可以以类似的方式获取其他提供者。因为这是一个布尔对象,你可以使用它在一个条件和适当的工作。如果用户需要触发提供者,您还可以创建一个逻辑来显示对话框并打开设置。 隐藏,复制Code

if(!isGPSEnabled && !isNetworkEnabled) {
    showSettingsDialog();
}

这将触发另一个函数,该函数在设置中提示用户激活提供程序。函数的结构如下: 隐藏,复制Code

public void showSettingsDialog() {
    new AlertDialog.Builder(mContext)
                .setTitle("Enable GPS")
                .setMessage("Enable GPS in your settings for receiving active location details.")
                .setNegativeButton("Cancel", null)
                .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                        mContext.startActivity(intent);
                    }
                })
                .create().show();
}

这将提示用户激活位置服务。出于本文的考虑,我可以模拟这个场景并向您展示它是如何工作的。例如,我们有一个应用程序激活位置提供程序并从它们那里获取位置。  图5:默认情况下显示设置和位置的Android设备是启用的。 我们可以禁用这个位置来查看应用程序的行为。 图6:位置现在被关闭。 现在,我们可以在应用程序中触发capture函数,看看会发生什么。首先,考虑我们有一个检查提供者是否启用的条件。如果不是,那么函数将显示一个警告框,否则,如果不是这样,则可能会引发异常,因为提供程序不可用。 当我们点击启用服务时,位置管理器会告诉我们没有启用提供者,因此应用程序会提示用户启用这些服务。否则,取消操作。 图7:Android警报对话框,提示他启用该位置。 用户可以在他们的设置中启用该位置,因为他们是禁用的。 隐藏,复制Code

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);

上面的意图会把用户带到默认的位置设置,所以这和其他应用程序做的事情是一样的,直接把你带到设置。 图8:位置关闭。用户可以打开它来启用提供者。 然后GPS会通知位置提供者正在工作,你的应用程序可以为用户捕获位置。 图9:系统托盘上显示的GPS标志 所以,这解释了你应该考虑检查你的应用程序的路径,并确保你写的高效的应用程序,为用户。  3.管理资源 上面显示的应用程序使用SMS资源、位置资源和电池。因此,由于我们只是想通知用户,你必须考虑保持时间跨度大,以节省电池。每次GPS引擎打开时,它就会开始消耗电池电量,所以你可能想要确保你的应用程序不会浪费电量。 最短时间 设置为,至少10分钟。除非你在屏幕上显示GPS,否则你不需要不断更新。最小距离 100米根本不重要,所以,这可能被设定为行进的最小距离。 这将允许我们的应用程序休眠一段时间,然后在一段时间后访问该位置。由于我们的应用程序能够在后台工作,我们不需要担心是用户自己触发请求还是应用程序自己管理请求。 SMS管理器将消耗资源,并将向用户收费,所以确保你写的文本非常简短,但一个小。 在我编写的应用程序中,有以下代码 隐藏,复制Code

if(m > 99 && min > 4 && min < 18001) {
    /* m is the variable for meters
     * min is the variable for minutes
     * 
     * The above condition checks if minimum minutes are less than 18000, that is enough!
     * also checks whether meters providers are greater than 100 or not. 
     * This ensures that user receives updates for location changes and battery isn't 
     * drained without need. 
     */
    new ContentManager(getBaseContext()).setupSettings(getBaseContext(), m, min);
}

代码工作并检查配置的验证。 不要发送批量邮件!几个月前我写了一个应用程序,它使用循环以数组的形式发送消息。这限制了整个网络,我现在必须接收的消息,在5到9个小时后才收到,而且很多时候我自己的消息没有发送,因为网络上的大量消息。尝试使用传递和发送报告向网络发送下一条消息。 应用程序示例 当我使用该应用程序时,我收到的消息如下SMS消息。我用我自己的号码作为联系方式,因为我想看看它会做得如何,它在第一次运行中做得很好,有一些问题,但我不会认为他们在学习过程中的一个问题。: -), 图10:我在使用我们刚刚学习了如何创建的服务时收到的短信。 因此,通过这种方式,您可以看到位置API可以非常有用! 利益点 该应用程序是为个人使用而开发的,但是本文并没有反映个人应用程序,而是解释了api和库。应用程序解释的使用 locationmanager locationlistener pendingintent smsmanager sqliteopenhelper basecolumns和更多… 本文并不强迫您固守一个框架或方法,您可以自由地以自己的方式编写和实现它。本文只是一个资源,您可以使用它从头开始构建自己的应用程序!下载源代码并开始学习。: -), 本文转载于:http://www.diyabc.com/frontweb/news30420.html

你可能感兴趣的:(好的,安卓,广播我的位置!)