【问题标题】:accessing android jar in unity3d在unity3d中访问android jar
【发布时间】:2014-01-03 22:19:31
【问题描述】:

我有一个用于相机手电筒的 android 项目,从 eclipse 部署时可以正常工作。我正在尝试从我在 unity3d 中的 C# 代码访问手电筒功能,但它不起作用。为了验证我是否正确调用了 android 方法,我在同一个活动中创建了一个字符串函数,它正确地返回了字符串。我对原生 android 编码不熟悉。如果你能看一下代码并帮助我,那就太好了。

我知道统一论坛和 stackoverflow 中有一些线程解释相同,我试图在这些线程上找到解决方案但没有运气!所以,发布了这个帖子..

下面是android MainActivity.java(我从eclipse转换成jar文件并复制到unity项目~Assets/Plugins/Android/bin/),

package com.example.newflash;

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.view.Window;
import android.view.WindowManager;

public class MainActivity extends Activity {

    private static Camera camera;
    private static Parameters parameters;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        //Hide the window title.
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
    }

    public static String dummyString()
    {
        return "dummy string";
    }

    public static void setFlashOn()
    {
        if (camera == null)
            camera = Camera.open();
        parameters = camera.getParameters();
        parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(parameters);
    }

    public static void setFlashOff()
    {
        parameters = camera.getParameters();
        parameters.setFlashMode(Parameters.FLASH_MODE_OFF);     
        camera.setParameters(parameters);
    }
}

下面是我的统一 C# 代码,

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System;

public class testJar : MonoBehaviour
{
    bool torchon;
    AndroidJavaClass testClasslight;

    void Start ()
    {
        torchon = false;
    }

    void OnGUI ()
    {
        string teststring = "empty";

        AndroidJavaClass testClass = new AndroidJavaClass("com.example.glassplaces.MainActivity");
        teststring = testClass.CallStatic<string>("dummyString");

        GUI.Label (new Rect (20, 20, 100, 60), teststring);

        if(GUI.Button(new Rect (20, 100, 100, 60), "ON"))
        {
            torchon = true;
        }

        if(torchon == true)
        {
            GUI.Label(new Rect(200, 20,100,60), "torch ON");
            testClass.CallStatic<AndroidJavaObject>("setFlashOn");
        }
    }
}

在AndroidManifest.xml 中添加访问相机的权限后,应用根本无法启动。从项目中排除 xml 文件时,“dummyString”方法仍然返回字符串。

下面是AndroidManifest.xml,

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.newflash"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/app_icon"
        android:label="@string/app_name">
        <activity
            android:name="com.example.newflash.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>
    </application>

</manifest>

以下是统一显示在控制台中的警告,其中包含在构建和运行期间包含的上述 xml,

Unable to find unity activity in manifest. You need to make sure orientation attribut is set to sensor manually.
UnityEditor.BuildPlayerWindow:BuildPlayerAndRun()

如果有人可以帮助我,那就太好了。非常感谢任何帮助。

提前谢谢你!

【问题讨论】:

标签: c# android jar unity3d


【解决方案1】:

我不能 100% 确定 CaffeineCoder 的上述回复是否准确。肯定可以不扩展 UnityPlayerActivity 并且我已经做到了。您需要在您的 Manifest 中指定这些特殊的 Unity 活动以及您自己的 Activity。

Unity 将首先启动 UnityPlayerProxyActivity 并从那里继续。只有在您调用/初始化它时才会调用您的 Java 代码。

以下是您可以指定的一些活动:

<activity
  android:name="com.unity3d.player.UnityPlayerProxyActivity"
  android:label="AngryBots Gamme"
  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
  android:screenOrientation="landscape"
>

  <intent-filter>
    <action android:name="android.intent.action.MAIN"/>
    <category android:name="android.intent.category.LAUNCHER"/>
  </intent-filter>

</activity>

<activity
  android:name="com.unity3d.player.UnityPlayerActivity"
  android:label="AngryBots Gamme"
  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
  android:screenOrientation="landscape"
/>

<activity
  android:name="com.unity3d.player.UnityPlayerNativeActivity"
  android:label="AngryBots Gamme"
  android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen"
  android:screenOrientation="landscape"
/>

【讨论】:

  • 你是对的,也可以不扩展活动并让它继续工作。我的错!我已经编辑了我的答案。感谢您提及。
【解决方案2】:

感谢 Stevethorne 的回答(关于 unityAnswers)。在将我的 java 活动扩展到“UnityPlayerActivity”时,我得到了它的工作。即com.unity3d.player.UnityPlayerActivity。 Here 是关于 UnityPlayerActivity 的更多详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多