【问题标题】:Watch Face is not syncing to wearable表盘未同步到可穿戴设备
【发布时间】:2016-09-20 22:30:06
【问题描述】:

我正在开发表盘。该项目由表盘和手持应用程序组成,用于报告手机电池电量。没有实际的配套应用程序 - 该应用程序甚至隐藏在抽屉中。 我遇到的问题是,当我在手机上安装应用程序时,面部没有在手表上同步。 我几乎符合我在互联网上找到的所有内容:

  1. apk 由 Android Studio 生成 - 发布版本,签名,穿戴应用在 res/raw 文件夹中。
  2. 移动应用和穿戴式应用的权限相同。
  3. 依赖项设置正确。
  4. APK 是通过 ADB 安装的,Watch 应用被强制同步 ...

值得一提的是,移动应用程序没有活动或其他东西。所以没有办法手动启动它。

我有什么遗漏的吗?从我的角度来看,没有理由不工作......

移动清单

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

    <uses-sdk android:minSdkVersion="18"
        android:targetSdkVersion="21" />

    <uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
    <uses-permission android:name="android.permission.BATTERY_STATS"/>
    <uses-permission android:name="android.permission.READ_CALENDAR"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name" >
        <!--android:theme="@style/AppTheme" >-->

        <service android:name="name.name.BatteryListener"
            android:permission="android.permission.BIND_WALLPAPER" >>

            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
                <category android:name="com.google.android.wearable.watchface.category.COMPANION_CONFIGURATION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

        <meta-data android:name="com.google.android.wearable.beta.app"
            android:resource="@xml/wearable_app_desc"/>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

    </application>

</manifest>

移动 Gradle

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

apply plugin: 'com.android.application'

repositories {
    jcenter()
}

dependencies {
    compile "com.android.support:support-v4:21.0.2"
    compile "com.android.support:support-v13:21.0.2"
    compile "com.android.support:cardview-v7:21.0.2"
    compile "com.google.android.support:wearable:1.1.+"
    compile 'com.google.android.gms:play-services-wearable:6.5.+'
    compile 'com.android.support:support-v13:21.0.+'

}

// The sample build uses multiple directories to
// keep boilerplate and common code separate from
// the main sample code.
List<String> dirs = [
        'main',     // main sample code; look here for the interesting stuff.
        'common',   // components that are reused by multiple samples
        'template'] // boilerplate code that is generated by the sample template process

android {
    compileSdkVersion 21
    buildToolsVersion "20"

    defaultConfig {
        applicationId "name.name"
        minSdkVersion 18
        targetSdkVersion 21
    }

    sourceSets {
        main {
            dirs.each { dir ->
                java.srcDirs "src/${dir}/java"
                res.srcDirs "src/${dir}/res"
            }
        }
        androidTest.setRoot('tests')
        androidTest.java.srcDirs = ['tests/src']

    }

佩戴清单

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

    <uses-sdk android:minSdkVersion="21"
        android:targetSdkVersion="21" />

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

    <!-- Required to act as a custom watch face. -->
    <uses-permission android:name="com.google.android.permission.PROVIDE_BACKGROUND" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.SET_TIME_ZONE"/>
    <uses-permission android:name="android.permission.BATTERY_STATS"/>
    <uses-permission android:name="android.permission.READ_CALENDAR"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.DeviceDefault">

        <service
            android:name="name.name.MyWatchFace"
            android:label="Name"
            android:permission="android.permission.BIND_WALLPAPER" >
            <meta-data
                android:name="android.service.wallpaper"
                android:resource="@xml/watch_face" />
            <meta-data
                android:name="com.google.android.wearable.watchface.preview"
                android:resource="@drawable/preview_square"/>
            <meta-data
                android:name="com.google.android.wearable.watchface.preview_circular"
                android:resource="@drawable/preview_circle" />
            <meta-data
                android:name="com.google.android.wearable.watchface.companionConfigurationAction"
                android:value="com.example.android.wearable.watchface.CONFIG_ANALOG" />

            <intent-filter>
                <action android:name="android.service.wallpaper.WallpaperService" />
                <category android:name="com.google.android.wearable.watchface.category.WATCH_FACE" />
                <category android:name="com.google.android.wearable.watchface.category.COMPANION_CONFIGURATION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

        </service>

        <service android:name="name.name.BatteryActivity">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
                <category android:name="com.google.android.wearable.watchface.category.COMPANION_CONFIGURATION" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </service>

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

    </application>

</manifest>

佩戴 Gradle

}
buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.0'
    }
}

apply plugin: 'com.android.application'



dependencies {


    compile 'com.google.android.gms:play-services-wearable:6.5.+'
    compile 'com.android.support:support-v13:21.0.+'
    compile 'com.google.android.support:wearable:1.1.+'
    compile 'com.google.android.support:wearable:1.1.0'
}

// The sample build uses multiple directories to
// keep boilerplate and common code separate from
// the main sample code.
List<String> dirs = [
        'main',     // main sample code; look here for the interesting stuff.
        'common',   // components that are reused by multiple samples
        'template'] // boilerplate code that is generated by the sample template process

android {
    compileSdkVersion 21

    buildToolsVersion "20"

    defaultConfig {
        applicationId "name.name"
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt')
        }
    }
    sourceSets {
        main {
            dirs.each { dir ->
                java.srcDirs "src/${dir}/java"
                res.srcDirs "src/${dir}/res"
            }
        }
        androidTest.setRoot('tests')
        androidTest.java.srcDirs = ['tests/src']

    }
}
}

两个 Gradle 文件都与 Android Watch Face 示例紧密匹配……我简直绝望了。

【问题讨论】:

    标签: android wear-os


    【解决方案1】:

    检查您在手机和手表清单文件中是否拥有相同的权限集。这是我处于同样情况的原因。

    【讨论】:

    • 如第一篇文章中所述 - 是的,我确实拥有相同的权限集。
    • 检查您的包裹是否在 Watch adb shell pm list packages 上。如果有,则错误在清单中的表盘描述中。
    • 不,手表上没有包装。看起来它根本没有安装/推送。而且我不知道为什么......我什至将我的应用程序与谷歌的 android 表盘样本进行了比较,这一切似乎都是正确的......
    • 手动打包也不起作用...用代码更新了第一篇文章。
    【解决方案2】:

    您的 Wear 清单中有这个:

    <meta-data
                android:name="com.google.android.wearable.watchface.companionConfigurationAction"
                android:value="com.example.android.wearable.watchface.CONFIG_ANALOG" />
    

    这看起来像是从示例代码中遗留下来的,并且很可能指向一个在您的移动应用中不存在的 Activity。这很可能会导致部署表盘时出现问题。

    尝试删除它,看看是否有帮助。

    【讨论】:

    • 不幸的是没有......问题仍然存在。该应用程序不会自动同步,并且在我强制同步时也不会同步。有没有办法在没有root的情况下检查logcat?
    【解决方案3】:

    我已经从 Wear 清单中删除了这 2 个:

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

    在我看来,权限的正确程序不应该是在移动设备和穿戴清单中具有相同的权限,而是在移动设备中继承穿戴权限,而不是(也)反之亦然。

    感谢您的帮助!

    【讨论】:

    • 我没有注意到这一点。可穿戴清单中的所有权限都需要包含在移动清单中(因此系统知道安装应用程序时需要哪些权限),但反之亦然。您删除的这些权限很可能是 Android Wear 无法识别或支持的权限。
    【解决方案4】:

    在您的移动 gradle 中...您需要包含此...

    dependencies {
        wearApp project(':Wearable')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多