Android App 无法部署到虚拟设备

Posted

技术标签:

【中文标题】Android App 无法部署到虚拟设备【英文标题】:Android App can't deploy to virtual device 【发布时间】:2017-04-25 12:37:10 【问题描述】:

背景: 我正在使用 Xamarin.Forms 创建一个内部移动应用程序,通过网络链接分发。我已经启动并运行了几天的 androidios,但请求是针对推送通知提出的。我们决定与 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&lt;manifest&gt; 元素中的 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无法连接设备问题解决

在移动设备上部署 C++ QML 插件的正确方法是啥?

Android App 无法运行,MainActivity 出现空点异常

Android TV App - 无法使用遥控器选择列表项

3.0Android Studio构建和运行应用

3.0Android Studio构建和运行应用