将字符串从HostApp发送到SmartExtension

时间:2013-09-13 10:19:09

标签: android android-intent sony-smartwatch

我是智能手表开发的新手。我想尝试从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); 
    }

}

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

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

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

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

    package 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);
    }
    

    }

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

    编辑:

    我仍然无法解决我的问题。我不知道我犯了什么错误, 正如马林所说,我确定了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);
    
        }
    

1 个答案:

答案 0 :(得分:0)

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

关于你的问题:

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

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

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

然后在你的app app中注册一个广播接收器:

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

编辑:

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

要回答原始问题,您需要制作服务以在主机应用中注册您的扩展程序,以便它显示在手表上。请参阅示例代码中的SampleExtensionService.java。

就接收要从主机应用程序注册的广播而言,您需要在AndroidManifest.xml中声明BroadcastReceiver,然后在onReceive()方法中启动您的服务。同样,查看此内容的最佳方法是查看示例中的ExtensionReceiver.java类。