2015-05-29 56 views
3

我一直試圖從Unity訪問一個活動方法,無法弄清楚爲什麼它不工作的生活。我已閱讀各種頁面,如http://forum.unity3d.com/threads/call-a-method-in-an-activity-using-androidjavaobject.219950/http://docs.unity3d.com/460/Documentation/Manual/PluginsForAndroid.html無法獲得統一C中的活動實例#

我正在嘗試爲Unity創建一個Camera插件。那裏有一些插件,但大多數都過時了,不起作用。無論如何,我都可以使用這些知識以備將來使用。我最初只是使用普通的Java課程,但爲了拍攝照片,我發現最好的方法是使用Intent,因爲它用於快速照片,而不是個性化的照相機應用程序。要使用意圖,必須使用活動。 Activity被傳遞給Intent,但Activity還必須重寫一個方法,以從Android文檔中概述的Intent接收結果。我會鏈接到它,但我只限於2個鏈接。

我正在使用它來訪問活動。 AndroidJavaClass初始化成功,但是,當我嘗試獲取上下文時,logcat中出現空ptr錯誤。

C#代碼

AndroidJavaClass link = new AndroidJavaClass("com.syncedsoftware.cameralink.CameraLinkActivity"); 
    AndroidJavaObject activity = link.Call<AndroidJavaObject>("getLinkContext"); // jni null ptr! 

    activity.Call("TakePicture"); 

它從未達到activity.Call( 「TakePicture」);.

的Java類STATICS- - 更新與新的靜態IMPLEMENTATION-

05-29 12:32:50.560 3408-3498/? V/Unityx﹕ GetLinkContext() 
05-29 12:32:50.810 3408-3498/? I/Unity﹕ Exception: JNI: Init'd AndroidJavaObject with null ptr! 
     at UnityEngine.AndroidJavaObject..ctor (IntPtr jobject) [0x00000] in <filename unknown>:0 
     at UnityEngine.AndroidJavaObject.AndroidJavaObjectDeleteLocalRef (IntPtr jobject) [0x00000] in <filename unknown>:0 
     at UnityEngine.AndroidJavaObject._CallStatic[AndroidJavaObject] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0 
     at UnityEngine.AndroidJavaObject.CallStatic[AndroidJavaObject] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0 
     at AndroidCameraLink.Start() [0x00000] in <filename unknown>:0 

東西我注意到的是,從未顯示的onCreate()消息 - 更新

         
 
          
  public class CameraLinkActivity extends UnityPlayerActivity { private static Context cameraLinkContext; public static Context getLinkContext(){ Log.v("Unityx", "GetLinkContext()"); return cameraLinkContext; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.v("Unity", "OnCreate"); cameraLinkContext = this; } public void TakePicture(){ Log.v("Unity", "TakePicture()"); } } 
         
 

logcat的輸出。這導致我相信該活動沒有被正確創建或創建。 活動從未被「創建」,因此onCreate()永遠不會被調用來初始化上下文字段。

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.syncedsoftware.cameralink"  android:theme="@android:style/Theme.NoTitleBar" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> 
    <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> 
    <application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false"> 
    <activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="@string/app_name" android:screenOrientation="portrait" 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" /> 
     </intent-filter> 
     <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 
     <meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="false" /> 
    </activity> 
<activity android:name="com.syncedsoftware.cameralink.CameraLinkActivity" /> 
     </application> 
     <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18" /> 
     <uses-feature android:glEsVersion="0x00020000" /> 
     <uses-permission android:name="android.permission.INTERNET" /> 
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera" /> 
</manifest> 

如果有人可以解釋爲什麼這不工作,我將非常感激。我一直試圖弄清楚這個問題已經有將近一個星期了,但沒有成功。這是我第一次踏入本土領土與Unity,請原諒我的無知。

UPDATE:正在調用getLinkContext(),但問題仍然存在。

將實現翻轉爲靜態後,我發現我忽略了logcat消息。將它翻轉爲靜態時,getLinkContext()被成功調用,但是,這並不能解決無法獲取Activity實例的原始問題。

cameraLinkContext爲null,因爲onCreate()永遠不會被調用。該活動從未被「創造」。

+0

請使用unity3d標籤。 –

+1

自從我使用任何擴展UnityPlayerNativeActivity的活動(我們很久以前轉換爲完全不同的插件創建方法)以來,已經有一段時間了,所以我不是100%確定的,但我相信這個問題可能在於事實上您的自定義Activity(com.syncedsoftware .....)未在Manifest中標記爲MainActivity。基本上,用清單中的活動名稱替換「com.unity3d.player.UnityPlayerNativeActivity」。 –

+0

@VenkatatAxiomStudios做完這些之後,應用程序甚至不會啓動。我得到一個說「應用程序未安裝」的敬酒信息。 –

回答

0

非靜態方法我可以(如果有興趣的鏈接如下)僞造基於YouTube的教程的解決方案。

的問題

這個問題是存在於一個事實,即統一併沒有技術上瞭解的活動,儘管它在清單中被定義,因此無法創建它。有人在下面指出了這一點,但是當我將我的活動作爲主要活動時,應用程序將拒絕發佈。這是正確的方法,但是如下所述還有更多。

解決方案

爲了得到它的工作,我不得不復制原始實施UnityPlayerActivity的,並將其粘貼到我的Java項目。在那裏,我相應地定製了它,並且擴展了UnityPlayerActivity。我將活動設置爲清單中的主要活動。我沒有試圖直接調用activity方法,而是爲我做了一個「橋樑」類。這個簡化的事項。 Java類中的UnityPlayer.currentActivity持有對UnityPlayer中正在使用的當前活動的引用。在這種情況下,我的定製課程就是這樣。我能夠使用這種方式調用Intent,並且它現在一切都完美無瑕。

步驟按步驟修正

的第一步是複製的原始實現UnityPlayerActivity.java的(在一個統一的安裝子文件夾中)和定製。它還擴展了UnityPlayerActivity(原始版本),以確保一切都正確鏈接到Unity。原始實現定義了許多使Unity播放器首先工作的對象和方法。

UnityPlayerActivity.java
package com.syncedsoftware.player; // changed package name 

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

import com.unity3d.player.UnityPlayer; 

public class UnityPlayerActivity extends com.unity3d.player.UnityPlayerActivity // extends the ORIGINAL implementation 
{ 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    // Process intent data 
} 

// Setup activity layout 
@Override protected void onCreate (Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 
} 

第二步是在添加活性清單中的主要活動。

AndroifManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.syncedsoftware.inventory" android:theme="@android:style/Theme.NoTitleBar" android:versionName="1.0" android:versionCode="1" android:installLocation="preferExternal"> 
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" /> 
<application android:icon="@drawable/app_icon" android:label="@string/app_name" android:debuggable="false" android:isGame="false" android:banner="@drawable/app_banner"> 
<activity android:name="com.syncedsoftware.player.UnityPlayerActivity" android:label="@string/app_name" android:screenOrientation="sensorLandscape" 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" /> 
    </intent-filter> 
    </activity> 
    </application> 
    <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18" /> 
    <uses-feature android:glEsVersion="0x00020000" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-feature android:name="android.hardware.camera" /> 
    <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> 
</manifest> 

第三步是在一個「橋樑」類內部的團結呼籲爲方便補充。

LinkBridge.java

package com.syncedsoftware.cameralink; 

import android.content.Intent; 
import android.provider.MediaStore; 

import com.unity3d.player.UnityPlayer; 

/** 
* Created by Anthony on 5/30/2015. 
*/ 
public class LinkBridge { 

public static void ShowCamera(int requestCode){ 
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    UnityPlayer.currentActivity.startActivityForResult(cameraIntent, requestCode); // Gets custom activity and uses the callback accordingly 
} 

} 

最後,我們在Unity添加代碼觸發ShowCamera()。 C#代碼 AndroidJavaClass jc = new AndroidJavaClass(「com.syncedsoftware.cameralink.LinkBridge」); jr.CallStatic(「ShowCamera」,1);

經過幾天尋找答案,我碰到這個視頻:https://www.youtube.com/watch?v=4l64nUGt0l0這幫了很多!爲了適應我的相機意圖情況,我翻轉了相應的實現。

1

你得到空指針異常,因爲你嘗試調用上AndroidJavaClass

+0

如果我將實現更改爲static,它會成功調用getLinkContext(),但它仍會拋出jni null ptr。這可能是因爲該活動未初始化。上下文是NULL,因爲onCreate()永遠不會被調用。 –

+0

該帖已更新,以反映這一點。您的解決方案解決了其中一個問題,謝謝!然而,該活動仍未被「創造」。 –

相關問題