`
wang_peng1
  • 浏览: 3954971 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Unity调用activity和布局

 
阅读更多
Unity 调用activity及其布局方法
如果 仅仅是调用android里面的方法 不涉及到布局,仅需要导出相关的Jar包就可以,但是如果我想调用android的activity以及相关的布局,仅仅导出Jar是不够的。如果我们想android布局和unity布局混杂使用,设想一个需求,用户需要在Unity渲染图片,而图片列表和选择需要在android里面做,然后将选中的路径传递给unity。 按照此需求 进行说明:前提是按照常规的jar的方法,将unity下的android的 class复制到android下。

1.	首先完成Unity场景 ChoiceScene,此场景添加两个button,视频选择,图片选择。
2.	每当点击这两个按钮,调用android 里面的方法:
   public static void StartPanoramaActivity(Context context)
	    {
	    	Intent intent = new Intent(context, PanoramaImageListActivity.class);
	    	context.startActivity(intent);
	    }
	 
	 public static  void StartLocalVideoActivity(Context context)
	    {
	    	Intent intent = new Intent(context, FullViewVideoListActivity.class);
	    	context.startActivity(intent);	
	    }
通过代码我们可以看到 这是启动两个android 下的activity,上述两个方法 放在CommonUtil这个静态类下面,unity调用 :

public static void StartPanoramaActivity() {
      
         AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
         AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        AndroidJavaClass CommonUtil = new AndroidJavaClass("com.goertek.play360.CommonUtil");
         CommonUtil.CallStatic("StartPanoramaActivity", jo);

        
    }

    public static void StartLocalVideoActivity() {

        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");

        AndroidJavaClass CommonUtil = new AndroidJavaClass("com.goertek.play360.CommonUtil");
        CommonUtil.CallStatic("StartLocalVideoActivity", jo);

    } 
这里和普通jar包没有区别,但是如果你仅仅通过jar包方式调用的话,当点击按钮的时候程序崩溃,因为在activy里面listview=(ListView) findViewById(R.id.list);
		listview.setAdapter(mImageListAdapter);
这时候说对象为空,如果仅仅运行android的程序,完全是正常的。这时候把res 也复制到unity里面,这个问题就解决了,但是找不到R.layout.这个时候我在生成jar包的时候把res和gen都选,又报错。或者我直接把bin直接导成jar,因为bin下面包含了res和class,可是还没有解决。也就是说 通过export 导出jar,在导出的时候 选择不同的选项 或者全选都通不过。

3.	 我经过测试 通过的方法是:将程序 android 属性中IsLibrary 打勾,然后clean(不clean没测试过,这是我的习惯),然后run,这个时候就会在bin下面生成一个jar,我觉得这个方法,比我们自己导要好一些,毕竟是系统做的,然后将gen和res,jar包同时放到unity  android中。测试通过。
4.	这里最好每次生成新jar的时候,将新的gen也换掉,我没有测试过没换的情况,如果你仅仅添加方法,而没有增删布局。
5.	这里还发现一个问题 unity下manifest.xml:
    <activity android:name="com.google.unity.GoogleUnityActivity"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape"
                  android:launchMode="singleTask"
                  android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="com.google.intent.category.CARDBOARD" />
            </intent-filter>
            <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
        </activity>

Android manifest:
<activity
            android:name="com.goertek.play360.MainActivity"
             android:screenOrientation="portrait"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
  
MainActivity 也是继承了UnityActivity,我并没有将android下的此xml复制到unity下,仅仅将unity需要启动的两个activity添加到unity下的xml,这个时候程序一样运行,即使我在unityxml里面没有添加  android:name="com.goertek.play360.MainActivity",这个还是优先于GoogleUnityActivity启动,GoogleUnityActivity没有启动。所以android 下的xml没有必要和unity一致,仅仅需要将用到的权限,启动的activity等加入即可,通过上面可以观察到unity自己会去寻找启动相关的UnityActivity。

如果在android 使用  UnityPlayer.UnitySendMessage("Sphere360", "RefreshParanaFilePath", imagePath);
他是告诉一个场景下叫Sphere360的对象,去执行RefreshParanaFilePath这个方法,但是即使我这个场景编辑到了unity运行环境中,但是没有运行过,那么就接收不到android传来的信息。这点类似于android的动态广播机制,不执行不接收。



 附件和上面的一样,没有测试代码,因为我是在实际工程中测试的

分享到:
评论

相关推荐

    Unity作为安卓子视图

    通常,你需要重写onCreate方法,设置SurfaceHolder.Callback,并在surfaceCreated、surfaceChanged和surfaceDestroyed方法中调用UnityPlayer的相关函数: ```java UnityPlayer.init(); UnityPlayer.setActivity...

    Android Unity3d demo 源码 AngryBots

    - `UnityPlayerActivity`: 这是Unity3D游戏在Android上的主Activity,负责游戏的启动和管理。它继承自UnityPlayerNativeActivity,处理游戏的生命周期事件。 - `UnityPlayer`: Unity3D在Android上的核心组件,负责...

    AndroidStatusBar

    例如,你可以使用`SYSTEM_UI_FLAG_FULLSCREEN`标志隐藏状态栏,然后使用`SYSTEM_UI_FLAG_LAYOUT_STABLE`和`SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION`来确保内容布局时不被状态栏遮挡。 在压缩包中的`AppStatusBar`...

    Unity3d怎么嵌入抓猫聚合平台广告

    在这个Activity中,你需要调用Android和Unity3d的通信接口,实现展示广告的方法。例如,在MainActivity中创建一个ZhuamobLayout对象,设置广告布局参数,并在onCreate方法中添加广告视图。 ```java public class ...

    1、Android调Activity1

    完成这些设置后,Android Studio会自动生成一个基本的"Hello World"应用,包括一个名为`MainActivity`的Activity和一个布局文件`activity_main.xml`。 `MainActivity`是应用的入口点,通常包含一个`onCreate`方法,...

    Android播放GIF动画源码

    10. **布局和样式**:在XML布局文件中,可以将自定义的GIFView作为普通视图添加,设置其大小、位置和其他属性,以适应界面设计。 综上所述,“TestGIFDemo”项目通过自定义View和使用第三方库,展示了如何在Android...

    android-support-v4和android-support-v7-appcompat

    例如,如果Unity应用需要使用Fragment或实现Material Design风格,就需要添加`android-support-v4.jar`和`android-support-v7-appcompat.jar`到项目中,并在Unity的Java插件部分进行相应的调用。 总结来说,`...

    一个Splash闪屏的例子

    然后在Activity的onCreate()方法中加载这个布局,并在适当的时机(如数据加载完成或界面准备就绪)调用startActivity()方法切换到主应用界面。 对于iOS开发者,可以使用Storyboard或XIB文件创建闪屏视图,然后在...

    android双屏异显的实现

    当你需要在辅助显示器上显示内容时,例如在特定活动(Activity)中,创建`CustomPresentation`的实例,并调用`show()`方法。 ```java if (display != null) { CustomPresentation presentation = new ...

    扫一扫和创建二维码

    5. **UI设计**:为了提供良好的用户体验,项目中可能还包括了界面布局和样式的设计。 ZXing库的强大之处在于它的灵活性和稳定性,无论是简单的扫描需求还是复杂的集成场景,都能很好地应对。开发者可以通过ZXing...

    android应用及游戏开发入门教程代码(2)

    你需要了解如何安装、配置和使用它,包括创建新项目、设置活动(Activity)、布局文件等。 2. **XML布局设计**:在Android中,UI界面通常是用XML来设计的。学习如何使用LinearLayout、RelativeLayout、...

    按钮侧滑功能简单实现

    1. 创建Fragment类:为每个页面创建一个Fragment类,实现其中的UI布局和逻辑。 2. 实现Adapter:继承`FragmentPagerAdapter`,并覆写`getItem()`方法来返回对应位置的Fragment实例,以及`getCount()`方法来返回...

    上拉下拉刷新,支持ListView,GridView,ScrollView

    4. 初始化和配置`ZrcListView`:在Activity或Fragment的onCreate方法中,找到对应的ListView或GridView实例,然后调用`ZrcListView`的初始化方法并传入自定义的刷新视图和回调接口。 5. 使用`ZrcListView`:在数据...

    游戏拼图puzzle

    - **生命周期**:理解Activity的生命周期,如`onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop()`, `onDestroy()`等方法的作用和调用时机。 2. **游戏功能实现**: - **拼图逻辑**:使用编程逻辑...

    android中 v4v7包.zip

    当Unity调用Android的API来安装APK时,特别是在Android 8.0(API级别26)及以上版本,会遇到权限问题。从Android 6.0(API级别23)开始,系统引入了运行时权限管理,这意味着应用在运行时需要请求一些敏感权限,而...

    Android应用源码之教你如何去除应用中的广告.zip

    例如,在Activity的布局文件中添加广告视图,或者在代码中调用显示广告的方法。 广告去除的第一步是定位源码中与广告相关的类和文件。这可能包括XML布局文件中的广告视图(如AdView或InterstitialAd),以及Java或...

    自定义MyProgressDialog控件的Demo

    6. **在布局中使用**:在Activity或Fragment的布局XML文件中,引入自定义控件,并设置属性。例如: ```xml android:id="@+id/my_progress_dialog" android:layout_width="wrap_content" android:layout_height...

    详解Android开发中Fragment的使用

    - `onActivityCreated()`:在Activity的`onCreate()`方法完成后调用,可以在这里初始化Fragment内的UI元素和进行业务逻辑处理。 - `onDestroyView()`:当Fragment的视图即将被销毁时调用。 - `onStart()`和`...

    Android实现3D卡片滑动效果

    在提供的资源文件`CardView-master`中,可能包含了完整的示例代码,包括卡片布局、Activity代码以及动画实现,你可以通过阅读和理解这些代码来进一步学习和实践3D卡片滑动效果。 总的来说,实现Android的3D卡片滑动...

Global site tag (gtag.js) - Google Analytics