为什么我的 Android 的 SAP 应用程序在安装后被删除

Why my SAP application for Android is being deleted after installation

我最近在玩我的三星 Gear 2(不是 S2)智能手表,我为它创建了一个新的表盘。我想在上面显示天气信息,我发现对于该任务我需要使用 Samsung Accessory Protocol (SAP)。

我按照三星教程创建了一个演示应用程序来学习如何使用 SAP

我在将 Tizen 应用程序部署到我的手表时遇到问题,但我发现目前可用的最低 (2017) API 是 2.3.1,其中 Gear 2 Smartwatch 为 2.2。 改在config.xml

<tizen:application id="XQKp7NYwyM.SimpleSAPConsumer" package="XQKp7NYwyM" required_version="2.3.1"/>

<tizen:application id="XQKp7NYwyM.SimpleSAPConsumer" package="XQKp7NYwyM" required_version="2.2"/>

我的应用程序已部署。

我创建了一个证书来构建一个签名的 wgt 包。

我还根据教程创建了一个 android 提供程序应用程序。 添加了新证书并创建了签名 apk.

我将 apk 复制到 Samsung Galaxy S3 phone 并尝试安装它。 安装结束没有任何问题。 但是,几秒钟后或当我尝试从手表初始化通信时,我从 Gear Manager 收到 "Unknown sources" 信息,我的应用程序正在被删除。

我已经在 android 中检查了 "Allow unknown sources",Gear Manager 并允许在智能手表上进行 USB 调试(因为这是我在这里的第一个问题,我不允许 post 超过2个链接,所以我不得不给one link所有的截图,抱歉)。

Why my application is being deleted and what should I do to have it working correctly.

Tizen 应用程序 - 消费者

使用 Tizen Studio 1.1.0 构建。

config.xml

<?xml version="1.0" encoding="UTF-8"?>
<widget xmlns="http://www.w3.org/ns/widgets" xmlns:tizen="http://tizen.org/ns/widgets" id="http://yourdomain/SimpleSAPConsumer" version="1.0.0" viewmodes="maximized">
    <tizen:application id="XQKp7NYwyM.SimpleSAPConsumer" package="XQKp7NYwyM" required_version="2.2"/>
    <content src="index.html"/>
    <feature name="http://tizen.org/feature/screen.size.all"/>
    <icon src="icon.png"/>
    <tizen:metadata key="AccessoryServiceLocation" value="res/xml/accessoryservices.xml"/>
    <name>SimpleSAPConsumer</name>
    <tizen:privilege name="http://developer.samsung.com/privilege/accessoryprotocol"/>
    <tizen:profile name="wearable"/>
</widget>

accessoryservices.xml

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <application name="HelloAccessoryConsumers">
    <serviceProfile role="consumer" name="sapsample" version="1.0" id="/sample/hello">
    <supportedTransports>
        <transport type="TRANSPORT_BT"/>
        <transport type="TRANSPORT_WIFI"/>
    </supportedTransports>
    <serviceChannel id="123" reliability="enable" priority="low" dataRate="low"> </serviceChannel>
    </serviceProfile>
    </application>
</resources>

如果需要,我可以提供其余的 Tizen 代码 (main.js、index.html)。现在我认为这对我面临的问题没有任何价值。

Android 应用程序 - 提供商

使用 Android Studio 2.2.3 构建 结构:

app
->assets
-->SimpleSapConsumer.wgt
->libs
-->accessory-v2.5.0.jar
-->sdk-1.0.0.jar
->src
-->main
--->java
---->com.sap.baks.sapapp.service
----->SapServiceProvider.java
--->res
---->xml
----->sapservice.xml
---->AndroidManifest.xml

AndroidManifest.xml

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

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

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="com.samsung.accessory.permission.ACCESSORY_FRAMEWORK"/>
    <uses-permission android:name="com.samsung.wmanager.APP"/>
    <uses-permission android:name="com.samsung.wmanager.ENABLE_NOTIFICATION"/>
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service android:name=".service.SAPServiceProvider">
        </service>

        <receiver android:name="com.samsung.android.sdk.accessory.RegisterUponInstallReceiver" >
            <intent-filter>
                <action android:name="com.samsung.accessory.action.REGISTER_AGENT" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.samsung.android.sdk.accessory.ServiceConnectionIndicationBroadcastReceiver" >
            <intent-filter>
                <action android:name="com.samsung.accessory.action.SERVICE_CONNECTION_REQUESTED" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="AccessoryServicesLocation"
            android:value="/res/xml/sapservices.xml" />
        <meta-data
            android:name="GearAppType"
            android:value="wgt" />
    </application>
</manifest>

sapservice.xml

<resources>
    <application name="SAPapp">
        <serviceProfile
            id="/system/sapsample"
            name="sapsample"
            role="provider"
            serviceImpl="com.sap.baks.sapapp.service.SAPServiceProvider"
            version="1.0"
            serviceLimit="ANY"
            serviceTimeout="10">
            <supportedTransports>
                <transport type="TRANSPORT_BT"/>
                <transport type="TRANSPORT_WIFI" />
            </supportedTransports>
            <serviceChannel
                id="123"
                dataRate="low"
                priority="low"
                reliability="enable"/>
        </serviceProfile>
    </application>
 </resources>

sapserviceprovider.java

我把它和截图放在一起,因为它很长。

******** 编辑 **********

按照@Iqbal 的建议尝试安装示例应用程序后,我得到了以下结果:

Tizen

在将 API 更改为 2.2 之前,我无法在手表上安装应用程序。如果 API 更大,我会看到以下错误:

[Initializing the launch environment...]
RDS: On
Target information: SM-R380
Application information: Id(VbsgE6bms2.HelloAccessoryConsumer), Package Name(VbsgE6bms2), Project Name(HelloAccessoryConsumer)

[Transferring the package...]
    Transferred the package: wgt stream -> /opt/usr/apps/tmp/HelloAccessoryConsumer.wgt

[Installing the package...]
path is /opt/usr/apps/tmp/HelloAccessoryConsumer.wgt
start process (install)
....
error : 61

end process (fail)
processing result : FATAL_ERROR [61] failed
spend time for pkgcmd is [1537]ms
cmd_ret:61
    An exception occurred
(Installing the package... > Fail)
An exception occurred
Unexpected stop progress...
(8.239 sec)

总结:我已经用 API 2.2 安装了应用程序,没有做其他更改。

Android

使用示例应用程序而无需更改任何内容,我能够 运行 它并与智能手表连接!玉皮 :) !

但我需要知道为什么我第一次使用的代码是错误的,即使我是从三星教程和网站上得到的。

我发现只有当我在 AndroidManifest.xml

中有这些行时,应用程序才会被卸载
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="com.samsung.accessory.permission.ACCESSORY_FRAMEWORK"/>
<uses-permission android:name="com.samsung.wmanager.APP"/>
<uses-permission android:name="com.samsung.wmanager.ENABLE_NOTIFICATION"/>

如果我用下面的行替换上面的行

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="com.samsung.accessory.permission.ACCESSORY_FRAMEWORK" />
<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />
<uses-permission android:name="com.samsung.WATCH_APP_TYPE.Companion" />
<uses-permission android:name="com.samsung.wmanager.ENABLE_NOTIFICATION" />

一切顺利。

谁能解释一下为什么会这样?

******** 编辑 2 **********

对于那些将搜索之前编辑的问题答案的人。 我找到了 here

长话短说:

 <uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />

是必须显示的行 - 否则该应用程序将从 android 设备中删除。老实说,我在任何文档中都没有发现这一点。

此外,

<uses-permission android:name="com.samsung.WATCH_APP_TYPE.Companion" />

定义智能手表应用程序将与 android 应用程序分开安装。 将 Companion 更改为 Integrated 后,可以看出智能手表应用程序已集成并将与 android 提供商应用程序一起安装。

关注