[英]Xamarin.Forms - Problem creating Android Wear Application
[英]How to run a Xamarin.Forms Application on an Android Wear Device
如何在Android Wear设备上运行Xamarin.Forms.Platform.Android.FormsApplicationActivity
? 我类的onCreate
方法中的调用base.OnCreate(bundle)
始终抛出RuntimeException“您不能在手表上使用不确定的进度”。
这是我的代码:
namespace Test
{
[Activity (Label = "Temp.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ());
}
}
}
App
的实现应该无关紧要,因为已经在超级onCreate
的调用上引发了异常,而不是通过调用LoadApplication (new App ())
加载应用程序。 但是,它是项目向导为Xamarin移动应用程序生成的基本实现。
您不会在可穿戴设备上运行Xamarin.Forms应用程序。 您需要在本机Xamarin.Android中创建一个新的Android Wear应用程序。 可穿戴式应用程序使用特殊的主题,特殊的控件并具有特殊的API。 一个很好的示例是我如何处理Hanselman.Forms,这是一个Xamarin.Forms主应用程序,但也与Android Wear应用程序相关: https : //github.com/jamesmontemagno/Hanselman.Forms
尽管有James Montemagno的回答,我还是发现可以Xamarin Forms同步数据。 我使用了Vincent Maverick的方法,并将其合并到Xamarin Forms中。 首先,请确保您已安装正确的Android SDK( Android Wear教程-全面介绍 )。 假设您拥有标准应用程序,建议在单独的Xamarin Forms Cross Platform应用程序中创建Wear应用程序。 这是因为Wear尺寸与Phone尺寸不同。
在Wear应用程序和电话应用程序中,右键单击Android项目的“引用”,然后选择“管理NUGET软件包”。 浏览磨损并选择
Xamarin.GooglePlayServices.Wearable版本29.0.0(较高的版本会带来问题)。
在两个应用程序中单击您的Android项目的属性。 确保默认命名空间(应用程序选项卡)和程序包名称(Android清单选项卡)相同。 另外,请确保“程序包”名称没有大写字母,这会导致在将应用发布到Android商店时出现问题。 将“使用Android版本编译”的值更改为“ API级别21(Xamarin.Android v5.0支持)”。
在您的两个项目的Android MainActivity中添加using
using Android.Gms.Wearable;
using Android.Gms.Common.Apis;
using Android.Support.V4.Content;
然后将两个应用程序的MainActivity更改为以下内容:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, IDataApiDataListener, IMessageApiMessageListener
{
private static GoogleApiClient client;
const string _syncPath = "/MySyncPath/Data";
static string device = "Watch";
static string text= "";
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
client = new GoogleApiClient.Builder(this)
.AddApi(WearableClass.API)
.Build();
IntentFilter filter = new IntentFilter(Intent.ActionSend);
MessageReciever receiver = new MessageReciever(this);
LocalBroadcastManager.GetInstance(this).RegisterReceiver(receiver, filter);
}
internal class MessageReciever : BroadcastReceiver
{
MainActivity _main;
public MessageReciever(MainActivity owner) { this._main = owner; }
public override void OnReceive(Context context, Intent intent)
{
_main.ProcessMessage(intent);
}
}
public void OnDataChanged(DataEventBuffer dataEvents)
{
var dataEvent = Enumerable.Range(0, dataEvents.Count)
.Select(i => dataEvents.Get(i).JavaCast<IDataEvent>())
.FirstOrDefault(x => x.Type == DataEvent.TypeChanged && x.DataItem.Uri.Path.Equals(_syncPath));
if (dataEvent == null)
return;
//do stuffs here
}
public override void OnBackPressed()
{
base.OnBackPressed();
}
protected override void OnStart()
{
base.OnStart();
Android.Util.Log.Info("WearIntegration", "Received Message");
client.Connect();
}
public void OnConnected(Bundle p0)
{
WearableClass.DataApi.AddListener(client, this);
}
public void OnConnectionSuspended(int reason)
{
Android.Util.Log.Error("GMSonnection suspended " + reason, "");
WearableClass.DataApi.RemoveListener(client, this);
}
public void OnConnectionFailed(Android.Gms.Common.ConnectionResult result)
{
Android.Util.Log.Error("GMSonnection failed " + result.ErrorCode, "");
}
protected override void OnStop()
{
base.OnStop();
client.Disconnect();
}
public void OnMessageReceived(IMessageEvent messageEvent)
{
if (messageEvent.Path.Equals(_syncPath))
{
var msg = System.Text.Encoding.UTF8.GetString(messageEvent.GetData());
this.RunOnUiThread(() =>
Android.Widget.Toast.MakeText(this, msg, ToastLength.Long).Show());
}
}
public void ProcessMessage(Intent intent)
{
if (intent.GetStringExtra("Device") != device)
{
text = intent.GetStringExtra("WearMessage");
//do stuffs here
}
}
public void SendData() {
try {
var request = PutDataMapRequest.Create(_syncPath);
var map = request.DataMap;
map.PutString("Device", device);
map.PutString("Message", "Xamarin Forms says Hello from Wearable!");
map.PutLong("UpdatedAt", DateTime.UtcNow.Ticks);
WearableClass.DataApi.PutDataItem(_client, request.AsPutDataRequest());
}
finally {
_client.Disconnect();
}
}
在您的“电话”应用程序中,如果要执行以下操作,请将静态字符串设备更改为“电话”并更改消息文本:
static string device = "Phone";
map.PutString("Message", "Xamarin Forms says Hello from Phone!");
然后将WearService类添加到两个Android项目中,添加与添加到MAinActivity中相同的用法,并更改Wearservice,如下所示:
[Service]
[IntentFilter(new[] { "com.google.android.gms.wearable.BIND_LISTENER" })]
public class WearService : WearableListenerService
{
const string _syncPath = "/KorfballTimer/Data";
GoogleApiClient _client;
public override void OnCreate()
{
base.OnCreate();
_client = new GoogleApiClient.Builder(this.ApplicationContext)
.AddApi(WearableClass.API)
.Build();
_client.Connect();
Android.Util.Log.Info("WearIntegrationreated", "");
}
public override void OnDataChanged(DataEventBuffer dataEvents)
{
var dataEvent = Enumerable.Range(0, dataEvents.Count)
.Select(i => dataEvents.Get(i).JavaCast<IDataEvent)
.FirstOrDefault(x => x.Type == DataEvent.TypeChanged && x.DataItem.Uri.Path.Equals(_syncPath));
if (dataEvent == null)
return;
//get data from wearable
var dataMapItem = DataMapItem.FromDataItem(dataEvent.DataItem);
var map = dataMapItem.DataMap;
string message = dataMapItem.DataMap.GetString("Message");
Intent intent = new Intent();
intent.SetAction(Intent.ActionSend);
intent.PutExtra("WearMessage", message);
intent.PutExtra("Device", map.GetString("Device"));
LocalBroadcastManager.GetInstance(this).SendBroadcast(intent);
}
}
最后,在元素下的AndroidManifest.xml中添加元数据:
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
如果您不希望在Wear应用程序中使用IOS和Windows项目,只需删除它们即可。 现在,您可以像使用电话应用程序一样在Xamarin Forms中构建Wear应用程序。 编码愉快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.