0

我是智能手表开发的新手。我想尝试将字符串从 hostapp 发送到 smartextension。根据 android 给出的教程,我制作了一个简单的应用程序,它可以获取字符串并有意发送到另一个活动。

现在,我想扩展它以便它可以与智能手表通信。在应用程序 intentHostapp。我有 mainactivity.java :

   package com.example.myfirstapp;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
    public final static String buzzIntent = "com.example.myfirstapp.buzzintent";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }
    Context mContext;


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



    /** Called when the user clicks the Send button */
    public void sendMessage(View view) {

        Intent intentBuzz = new Intent();
        EditText editText = (EditText) findViewById(R.id.edit_message);
        String buzzIntent = editText.getText().toString();
        intentBuzz.setAction(buzzIntent);
        startService(intentBuzz); 
    }

}

我从这个问题中获取了这些代码。

在这部分中,我是否必须为我的应用程序创建一些服务类?

在另一个应用程序中,我创建了 5 个类:

  1. HelloWatchExtension :我的想法是在这里制作字符串
  2. HelloWatchExtension 接收器:从广播接收器扩展
  3. HelloWatchExtension Service:用于 smartextension 广播服务
  4. SRegistrationInformation:为了将它们注册到智能连接的智能扩展(我认为)我已经声明了 HelloWatchExtension 以接收意图

    包 com.example.hellowatch;

    public class HelloWatchExtension extends ControlExtension{
    
    int width;
    int height;
    
    
    
    RelativeLayout layout;
    Canvas canvas;
    Bitmap bitmap;
    TextView textView;
    
    public void onCreate()
    {
        Intent intent = new Intent("com.example.myfirstapp.buzzintent");
        String message = intent.getAction();
        textView.setText(message);
    
    }
    public HelloWatchExtension(Context context, String hostAppPackageName) {
        super(context, hostAppPackageName);
        width = getSupportedControlWidth(context);
        height = getSupportedControlHeight(context);
        layout = new RelativeLayout(context);
        textView = new TextView(context);
    
    
    
        textView.setTextSize(9);
        textView.setGravity(Gravity.CENTER);
        textView.setTextColor(Color.WHITE);
        textView.layout(0, 0, width, height);
    
    }
    
    
    @Override
    public void onResume() {
        updateVisual();
    }
    private void updateVisual() {
    
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        canvas = new Canvas(bitmap);
        layout.draw(canvas);
    
        showBitmap(bitmap);
    }
    
    public static int getSupportedControlWidth(Context context) {
        return context.getResources().getDimensionPixelSize(
                R.dimen.smart_watch_control_width);
    }
    
    public static int getSupportedControlHeight(Context context) {
        return context.getResources().getDimensionPixelSize(
                R.dimen.smart_watch_control_height);
    }
    

    }

这些是我在文档中看到的类,但我不知道将接收器用于 HostApp 的意图?

编辑:

我仍然无法解决我的问题。我不知道自己犯了什么错误,正如 Marlin 所说,我确定了 3 点:1. 制作服务以在主机应用程序中注册您的扩展

public class HelloWatchRegistrationInformation extends RegistrationInformation {
    final Context context;

    protected HelloWatchRegistrationInformation(Context context) {
        if (context == null) {
            throw new IllegalArgumentException("context == null");
        }
        this.context = context;
    }

    @Override
    public ContentValues getExtensionRegistrationConfiguration() {
        String extensionIcon = ExtensionUtils.getUriString(context,
                R.drawable.ic_extension);
        String iconHostapp = ExtensionUtils.getUriString(context,
                R.drawable.ic_launcher);

        String configurationText = context.getString(R.string.configuration_text);
        String extensionName = context.getString(R.string.extension_name);

        ContentValues values = new ContentValues();

        values.put(Registration.ExtensionColumns.CONFIGURATION_TEXT, configurationText);
        values.put(Registration.ExtensionColumns.EXTENSION_ICON_URI, extensionIcon);
        values.put(Registration.ExtensionColumns.EXTENSION_KEY,
                HelloWatchExtensionService.EXTENSION_KEY);
        values.put(Registration.ExtensionColumns.HOST_APP_ICON_URI, iconHostapp);
        values.put(Registration.ExtensionColumns.NAME, extensionName);
        values.put(Registration.ExtensionColumns.NOTIFICATION_API_VERSION,
                getRequiredNotificationApiVersion());
        values.put(Registration.ExtensionColumns.PACKAGE_NAME, context.getPackageName());

        return values;
    }

    @Override
    public int getRequiredNotificationApiVersion() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int getRequiredWidgetApiVersion() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public int getRequiredControlApiVersion() {
        // TODO Auto-generated method stub
        return 1;
    }

    @Override
    public int getRequiredSensorApiVersion() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public boolean isDisplaySizeSupported(int width, int height) {
        return ((width == HelloWatchExtension.getSupportedControlWidth(context) && height == HelloWatchExtension
                .getSupportedControlHeight(context)));
    }
}

2.. 在你的 AndroidManifest.xml 中声明一个 BroadcastReceiver *

...

<service android:name=".HelloWatchExtensionService" />
        <receiver android:name=".HelloWatchExtensionReceiver" >
            <intent-filter>

                <!-- Generic extension intents. -->
                <action android:name="com.sonyericsson.extras.liveware.aef.registration.EXTENSION_REGISTER_REQUEST" />
                <action android:name="com.sonyericsson.extras.liveware.aef.registration.ACCESSORY_CONNECTION" />
                <action android:name="android.intent.action.LOCALE_CHANGED" />

                <!-- Notification intents -->
                <action android:name="com.sonyericsson.extras.liveware.aef.notification.VIEW_EVENT_DETAIL" />
                <action android:name="com.sonyericsson.extras.liveware.aef.notification.REFRESH_REQUEST" />

                <!-- Widget intents -->
                <action android:name="com.sonyericsson.extras.aef.widget.START_REFRESH_IMAGE_REQUEST" />
                <action android:name="com.sonyericsson.extras.aef.widget.STOP_REFRESH_IMAGE_REQUEST" />
                <action android:name="com.sonyericsson.extras.aef.widget.ONTOUCH" />
                <action android:name="com.sonyericsson.extras.liveware.extension.util.widget.scheduled.refresh" />

                <!-- Control intents -->
                <action android:name="com.sonyericsson.extras.aef.control.START" />
                <action android:name="com.sonyericsson.extras.aef.control.STOP" />
                <action android:name="com.sonyericsson.extras.aef.control.PAUSE" />
                <action android:name="com.sonyericsson.extras.aef.control.RESUME" />
                <action android:name="com.sonyericsson.extras.aef.control.ERROR" />
                <action android:name="com.sonyericsson.extras.aef.control.KEY_EVENT" />
                <action android:name="com.sonyericsson.extras.aef.control.TOUCH_EVENT" />
                <action android:name="com.sonyericsson.extras.aef.control.SWIPE_EVENT" />

                <!-- From SmartPhone  -->
                <action android:name="com.example.myfirstapp.buzzintent"/>

            </intent-filter>
        </receiver>
    </application>

... 3. 在 onReceive() 方法中启动您的服务。

@Override
    public void onReceive(Context context, final Intent intent) {
        //Log.d(HelloWatchExtensionReceiver.TAG,"onReceive:  " + intent.getAction());
        intent.setClass(context, HelloWatchExtensionService.class);
        context.startService(intent);

    }
4

1 回答 1

0

您是否查看过 Sony Add-on SDK 中的示例代码,特别是 SampleControlExtension?这将是一个很好的例子。

关于你的问题:

将字符串从您的应用程序发送到扩展程序 - 这取决于您要对该字符串执行的操作。如果您想在手表屏幕上显示它,请在我上面提到的示例代码中查找 showBitmap() 方法作为示例。

将数据从扩展程序发送到您的应用程序 - 这与您在标准 Android 应用程序中的操作方式相同。基本上,在您的扩展中,您会广播 Intent,如下所示:

Intent intentBuzz = new Intent();
intentBuzz.setAction(buzzIntent);
mContext.sendBroadcast(intentBuzz); 

然后在您的应用程序活动中注册一个广播接收器:

buzzReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
    buzzAction();
}
};
registerReceiver(buzzReceiver, new IntentFilter(buzzIntent));

编辑:

我意识到我可能误解了你原来的问题。听起来您只是想向主机应用程序注册您的扩展程序,以便它显示在手表上,对吗?由于宿主应用程序是 Sony 应用程序,因此无法修改其代码,因此您无法将字符串从宿主应用程序发送到您的扩展程序,反之亦然。如果您正在谈论从手机/平板电脑上运行的应用程序发送字符串到手表本身上运行的扩展程序,那么我上面的答案是正确的。

那么要回答最初的问题,您确实需要创建一个服务来在主机应用程序中注册您的扩展程序,以便它显示在手表上。请参阅示例代码中的 SampleExtensionService.java。

至于接收广播以从主机应用程序注册,您需要在 AndroidManifest.xml 中声明一个 BroadcastReceiver,然后在 onReceive() 方法中启动您的服务。同样,最好的方法是查看示例中的 ExtensionReceiver.java 类。

于 2013-09-13T20:31:52.230 回答