Unity和android通信

前言:

最近做Unity接入各平台SDK,看了雨松MOMO博客(http://www.xuanyusong.com/archives/667),更新SDK包到最新的4.4,做了个demo,出现各种问题,为了解决这些问题,

整了整整2天才跑通。现记录下来以后查看。

1:eclipse创建android工程项目UnitySDK

注意:

Minimum Required SDK 选择最低API 9,因为最新的SDK包 使用的 setContentView(R.layout.activity_main); startActivity(intent);

需要API9,不然就会提示错误:Call requires API level 9 (current min is 8): android.app.NativeActivity#setContentView。

而eclipse又很难检测出此错误,即使 android:minSdkVersion="8" ,eclipse打包没有修改的sdk包apk仍正常在真机上运行显示activity。

但是,一旦导入到unity工程中生成apk后,就会显示不出要启动的activity,加载setContentView(R.layout.activity_main) 报错:

android.content.res.resoureces$NotFoundException  提示无法找到 activity_main 的ID。

为了这个问题,痛苦了1天,不知道哪里出问题。因此在创建android工程后,最好手动检测下:

右键工程项目->android tools -> 点击 run lints: check common errors ,来显示目前项目上的错误。如果 android:minSdkVersion= 低于api对应的版本就会提示出来。

2:创建主Activity

Unity程序一起动就会调用这个MainActivity.java,它是在AndroidManifest.xml中配置的。它需要继承unity的UnityPlayerActivity类。

因此需要unity提供的android的classes.jarr文件,

路径:E:\unity4.5\Data\PlaybackEngines\androidplayer\development\bin 下可以找到。

需要导入到android工程里面,看android工程是否存在libs文件夹,sdk更新后,

每次创建android工程都会自动创建libs的。我们需要把classes.jar 文件放入libs里面。

对工程按F5刷新,则会自动导入到private Libraries里面:

MainActivity.java :

package com.example.unitysdk;

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;

import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity  {

		Context mContext = null;
	    @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        mContext = this;
	    }

	    public void StartActivity0(String name)
	    {
	    	Intent intent = new Intent(mContext,TestActivity0.class);
	    	intent.putExtra("name", name);
	    	this.startActivity(intent);
	    }

}

TestActivity0.java:

package com.example.unitysdk;

import android.app.Activity;
import android.os.Bundle;

public class TestActivity0 extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
TestActivity0属于Unity程序的子Activity所以它不需要继承UnityPlayerActivity,直接继承Activity即可。
<span style="font-family: Arial, Helvetica, sans-serif;">Activity_main.xml: 默认的</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="html"><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.unitysdk.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
</RelativeLayout>


3:修改下AndroidManifest.xml文件,添加TestActivity0的activity
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.unitysdk"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="9"
        android:targetSdkVersion="16" />
    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.unitysdk.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.example.unitysdk.TestActivity0"
            android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
            >
        </activity>
    </application>

</manifest>

4:修改res/values,values-xx里面的styles.xml,删掉menu里面的文件main.xml

</pre><pre code_snippet_id="482409" snippet_file_name="blog_20141011_14_7145067" name="code" class="csharp" style="font-family: Verdana, 'Microsoft YaHei';"><pre name="code" class="html"><style name="AppBaseTheme" parent="Theme.AppCompat.Light">
改为
<style name="AppBaseTheme" parent="android:Theme.Light">
 同理,将
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar">
改为
<style name="AppBaseTheme" parent="android:Theme.Holo.Light.DarkActionBar">
不然在unity生成apk时候报错:
Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
E:\android\android-sdks\build-tools\19.1.0\aapt.exe package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "E:/android/android-sdks/platforms/android-20\android.jar" -F bin/resources.ap_

stderr[
res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'.
res\values-v11\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'.
res\values-v14\styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.

5:导出此工程的jar文件
不要手动用jar命令去导出,直接右键工程项目->Export->Java->JAR file
一直默认,点击Finish就导出了sdk.jar文件了。
6:创建unity工程,放入sdk.jar文件。
Unity工程中文件夹的结构如下,Plugins->Android的名称不能修改。把android工程文件:res文件夹,AndroidManifest.xml
拷贝到unity的Assets/Plugins/Android/ 目录下。Sdk.jar也放到此目录下。
</pre><pre code_snippet_id="482409" snippet_file_name="blog_20141011_24_6056199" name="code" class="csharp" style="font-family: Verdana, 'Microsoft YaHei';">using System.Collections;
public class Test : MonoBehaviour
{
    void OnGUI()
    {
        if (GUILayout.Button("OPEN Activity01", GUILayout.Height(100)))
        {
            AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
            jo.Call("StartActivity0", "第一个Activity");
        }
    }
}

8:最后要注意Unity中的包名,要和Android工程保持一致,否则无法调用。如下图所示,Bundle Identifier* 当前项目为com.example.unitysdk 。
</pre><pre code_snippet_id="482409" snippet_file_name="blog_20141011_27_3799115" name="code" class="csharp" style="font-family: Verdana, 'Microsoft YaHei';">9:build打包生成APK。
</pre><pre name="code" class="csharp" style="font-family:Verdana,'Microsoft YaHei'">
时间: 2024-11-05 20:31:23

Unity和android通信的相关文章

Unity之SDK接入(Unity与Android通信)

1.eclipse中新建Android工程,添加MainActivity.java代码: package com.example.test; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; import android.os.Bundle; public class MainActivity extends UnityPlayerActivity { protected v

Unity与Android通信的中间件

2.1.1 Fragment和Activity都需要实现的接口——IBaseView/** * Description:Basic interface of all {@link Activity} * or * {@link Fragment} * or * {@link android.app.Fragment} * <p> * Creator:yankebin * CreatedAt:2018/12/18 */public interface IBaseView { /** * Retu

Unity 调用android插件

1. Unity的Bundle Identifier必须和你的android报名一致 Activity和View的区别: Activity应该是一个展示页面,View是页面上一些按钮视图等等. 如何调用Android插件:  (如果你把方法主入口中的) AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //参数不变 AndroidJavaObject jo = jc.GetStat

Unity3d与android通信

unity3d与android的通信,从网上搜索了一些文章,发现我的始终不成功!后来调试通了,现在 总结一下! 要注意几个地方: 1.不管是win7 64位还是32位,都可以!但是都必须要安装32位的java sdk1.6,eclipse 32,adt 32位! 2.新建的android项目,必须选择Target SDK为Android 4.0 SDK以上,如果选择 Android 4.0 SDK以下的,导入到unity中打包的时候会提示一些xml文件的错误! SDK选择图 如果不选择SDK 4

Unity在Android和iOS中如何调用Native API

本文主要是对unity中如何在Android和iOS中调用Native API进行介绍. 首先unity支持在C#中调用C++ dll,这样可以在Android和iOS中提供C++接口在unity中调用.利用这一特性,可以扩展unity的功能.例如集成和调用第三方库.同时为了满足对unity接口的一致性,可以考虑在android和iOS上提供相同的接口供C#调用. 这里列举以下两个例子. 1. 1. 以弹出一个覆盖部分屏幕的webview为例来说明如何从C#调用Native接口. 2. 2. 简

unity导出android遇到的build target 错误详解

1. 导出运行后显示build target ="9",version is wrong ,can't  loaded xxx.untiy3d files 之类的,一般情况看导出的jar包内的project.properties中target 是否正确,改正后而且要clean相关项目. 2.看AndroidManifest.xml下    android:minSdkVersion和android:targetSdkVersion 是否正确,改正后refresh 3.看报错信息是否提示

unity与android交互总结

在网上找了很多教程,基本上使用的方法都是在eclipse上新建普通android工程,让主activity继承UnityPlayerActivity,然后在该activity中写供unity调用的接口或者主动要回调unity的接口,然后导出jar包到unity. 这种方式只要人品不好就会出一堆乱七八糟的问题: 如新建工程时选择SDK版本小于4.0时在unity build APK时报错,因为style.xml就不会有parent="Theme.AppCompat.Light,而是parent=&

unity与android的无缝连接

对unity游戏工程android客户端进行二次开发,其实只要明白 unity和android之间如何相互调用即可.这方面网上已经有博客介绍. u3d游戏公司打包android客户端游戏一般来说有两种方式: 1:在eclipse中编写所需要的java代码打包成jar,放到untiy中,用unity直接导出apk 2:从unity中打包出android工程,导入到eclipse中,进行二次开发,再打包出来 第一种,多次打包比较方便,第二种,可以直接log到错误.各有好坏. 这阵子项目刚好需要实现 

unity和Android交互

最近在接触unity.对于unity和Android的交互,网上找了好多,大多都是一种方式,下面就说一下我使用后的心得. 首先: unity调用Android, unity代码: AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject> ("currentA