Android App 无法部署到虚拟设备
Posted
技术标签:
【中文标题】Android App 无法部署到虚拟设备【英文标题】:Android App can't deploy to virtual device 【发布时间】:2017-04-25 12:37:10 【问题描述】:背景: 我正在使用 Xamarin.Forms 创建一个内部移动应用程序,通过网络链接分发。我已经启动并运行了几天的 android 和 ios,但请求是针对推送通知提出的。我们决定与 Pushwoosh 一起提供该服务。
我从 pushwoosh 复制了示例代码并使用我们的包名和密钥对其进行了修改,但由于某种原因我收到错误:The application could not be started. Ensure that the application has been installed to the target device and has a launchable activity (MainLauncher = true).
Additionally, check Build->Configuration Manager to ensure this project is set to Deploy for this configuration.
我还应该注意到 Pushwoosh 使用 GCM,因此它也可能与此有关。
我的尝试: 1.我的第一步显然是检查配置管理器。它确实设置为 Deploy 并且设置为编译 x86(对提到的其他问题的一些其他答案) 2. 我确认我的 MainActivity.cs 文件中的活动是 indead 设置的 MainLauncher=true。 3.根据其他问题/答案的建议,我已从虚拟 android 中删除了该应用程序。 (实际上我完全重置了虚拟设备)。 4. 正如一些 GCM 特定的 QA 中提到的,我已将我的包名称更改为全小写。
我的相关代码:
[Activity(Label = "mobile", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
[IntentFilter(new string[] "company.MESSAGE" , Categories = new string[] "android.intent.category.DEFAULT" )]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
LocalMessageBroadcastReceiver mMessageReceiver;
LocalRegisterBroadcastReceiver mRegisterReceiver;
bool mBroadcastPush = true;
protected override void OnCreate(Bundle bundle)
base.OnCreate(bundle);
mMessageReceiver = new LocalMessageBroadcastReceiver();
mMessageReceiver.activity = this;
mRegisterReceiver = new LocalRegisterBroadcastReceiver();
mRegisterReceiver.activity = this;
registerReceivers();
PushManager manager = PushManager.GetInstance(this);
manager.OnStartup(this);
//Register for push!
manager.RegisterForPushNotifications();
checkMessage(Intent);
global::Xamarin.Forms.Forms.Init(this, bundle);
LoadApplication(new App());
protected override void OnNewIntent(Intent intent)
checkMessage(intent);
public void checkMessage(Intent intent)
if (null != intent)
if (intent.HasExtra(PushManager.PushReceiveEvent))
doOnMessageReceive(intent.Extras.GetString(PushManager.PushReceiveEvent));
else if (intent.HasExtra(PushManager.RegisterEvent))
doOnRegistered(intent.Extras.GetString(PushManager.RegisterEvent));
else if (intent.HasExtra(PushManager.UnregisterEvent))
doOnUnregisteredError(intent.Extras.GetString(PushManager.UnregisterEvent));
else if (intent.HasExtra(PushManager.RegisterErrorEvent))
doOnRegisteredError(intent.Extras.GetString(PushManager.RegisterErrorEvent));
else if (intent.HasExtra(PushManager.UnregisterErrorEvent))
doOnUnregistered(intent.Extras.GetString(PushManager.UnregisterErrorEvent));
resetIntentValues();
public void doOnRegistered(String registrationId)
// code to run if device has succesfully registered
public void doOnRegisteredError(String errorId)
// code to run if device failed to register
public void doOnUnregistered(String registrationId)
// code to run if device has succesfully unregistered
public void doOnUnregisteredError(String errorId)
// code to run if device failed to unregister properly
public void doOnMessageReceive(String message)
// code to run when device receives notification
private void resetIntentValues()
Intent mainAppIntent = Intent;
if (mainAppIntent.HasExtra(PushManager.PushReceiveEvent))
mainAppIntent.RemoveExtra(PushManager.PushReceiveEvent);
else if (mainAppIntent.HasExtra(PushManager.RegisterEvent))
mainAppIntent.RemoveExtra(PushManager.RegisterEvent);
else if (mainAppIntent.HasExtra(PushManager.UnregisterEvent))
mainAppIntent.RemoveExtra(PushManager.UnregisterEvent);
else if (mainAppIntent.HasExtra(PushManager.RegisterErrorEvent))
mainAppIntent.RemoveExtra(PushManager.RegisterErrorEvent);
else if (mainAppIntent.HasExtra(PushManager.UnregisterErrorEvent))
mainAppIntent.RemoveExtra(PushManager.UnregisterErrorEvent);
Intent = mainAppIntent;
protected override void OnResume()
base.OnResume();
registerReceivers();
protected override void OnPause()
base.OnPause();
unregisterReceivers();
public void registerReceivers()
IntentFilter intentFilter = new IntentFilter(PackageName + ".action.PUSH_MESSAGE_RECEIVE");
if (mBroadcastPush)
RegisterReceiver(mMessageReceiver, intentFilter);
RegisterReceiver(mRegisterReceiver, new IntentFilter(PackageName + "." + PushManager.RegisterBroadCastAction));
public void unregisterReceivers()
UnregisterReceiver(mMessageReceiver);
UnregisterReceiver(mRegisterReceiver);
1
我承认我是 android 开发的新手(但不是 .net 或 C#),所以这可能是相对明显的,但我不知所措。我已经查看了我能找到的与此相关的所有问题,但没有一个解决方案有帮助。谁能看到我做错了什么?
【问题讨论】:
再次检查您的最终清单obj\Debug\android
是否没有为不同的活动设置两个主要启动器。否则,请尝试攻击您的 bin
/ obj
。
【参考方案1】:
我相信这两行:
<permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="PACKAGE_NAME.permission.C2D_MESSAGE" />
应该将 PACKAGE_NAME 更改为您的实际包名称,在您的情况下为 com.company.mobile
(<manifest>
元素中的 package
属性)。
那就试试吧:
<permission android:name="com.company.mobile.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.company.mobile.permission.C2D_MESSAGE" />
【讨论】:
谢谢。我知道这一定是我错过的一些简单的事情。我还有其他一些问题需要解决,但这让我开始着手解决这些问题。它现在工作。再次感谢。以上是关于Android App 无法部署到虚拟设备的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu18.04下QT开发Android无法连接设备问题解决