Android Wear 2.0通过手机获取位置,并在Google Play商店中支持设备支持

时间:2017-01-29 03:48:31

标签: android google-play wear-os android-wear-2.0

最近,我一直在为Android Wear 2.0制作Bus Checker应用,作为独立应用,以便iOS用户也可以使用它。

我显然得到了手表的位置以获得当地的巴士站。这意味着我需要使用以下权限:

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

即使我的华为手表可以获得&#34;手表&#34;通过手机,在将应用程序发布到Google Play商店时,只有支持GPS的设备支持它:LG Watch Urbane 2nd Edition LTE。

我真的不知道该怎么做,我想发布我的应用程序,用于没有GPS的设备,只是从手机上获取GPS,但要通过手机获取GPS,我需要那些权限和这些权限会导致华为手表和其他非GPS设备不受支持。

我尝试将此添加到我的清单中以测试华为手表是否会受到支持:

<uses-feature android:name="android.hardware.LOCATION" android:required="false" />
<uses-feature android:name="android.hardware.location.GPS" android:required="false" />
<uses-feature android:name="android.hardware.location.NETWORK" android:required="false" />

但遗憾的是,它并没有奏效。兼容性绝对基于权限,而不是所需的功能。我也尝试使用空白的Hello World应用程序无效。

如果它有任何相关性,这是我的应用清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.buschecker.williamvenner.buschecker">

    <uses-feature android:name="android.hardware.type.watch" android:required="true" />

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

    <application android:allowBackup="true" android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" android:supportsRtl="true"
        android:theme="@android:style/Theme.DeviceDefault">
        <uses-library android:name="com.google.android.wearable" android:required="false" />

        <activity android:name=".MainActivity" android:label="@string/app_name"
            android:theme="@android:style/Theme.DeviceDefault.Light">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".BusStopView"
            android:theme="@android:style/Theme.DeviceDefault.Light">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
    </application>

</manifest>

我的Gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.buschecker.williamvenner.buschecker"
        minSdkVersion 25
        targetSdkVersion 25
        versionCode 1
        versionName "1"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.support:wearable:2.0.0-beta2'
    compile 'com.google.android.gms:play-services-wearable:10.0.1'
    compile 'com.google.android.gms:play-services-location:10.0.1'
    compile 'com.mcxiaoke.volley:library:1.0.19'
    provided 'com.google.android.wearable:wearable:2.0.0-beta2'
    wearApp project(':app')
}

我的项目结构可以找到here

2 个答案:

答案 0 :(得分:0)

某些权限意味着功能要求。

明确在Manifest声明的权限要求ACCESS_FINE_LOCATION中隐含了android.hardware.location.gps的要求

请参阅docs

因此声明该功能不是必需的

<uses-feature android:name="android.hardware.location.gps" android:required="false" />

不适用,也不会阻止Play商店针对无GPS设备过滤您的应用。

为避免这种情况,请从Manifest中删除ACCESS_FINE_LOCATION请求。 (但是根据需要声明anroid.hardware.location和android.hardware.location.network的功能请求,以确保Play商店不再为没有任何网络硬件的设备过滤掉应用程序。)

为了确保您的应用可以在配备它的设备上使用GPS服务,请在您的代码中执行检查,以确定LocationManager.GPS_PROVIDER是否包含在所有可用提供商的列表中。 例如。如Permissions that Imply Feature Requirements

locationManager = (LocationManager)
this.getSystemService(Context.LOCATION_SERVICE);
boolean deviceHasGPS = false;
if (locationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) {
    deviceHasGPS = true;
}

答案 1 :(得分:0)

你应该考虑使用FusedLocationProvider作为手表,因为像华为这样的手表可以通过手机获取它们的位置。 FusedLocationProvider可以很容易地不用担心位置的来源。

我使用了精确的位置许可,并且没有问题,该应用没有出现在华为手表游戏商店。