Java 我需要通过按下unity应用程序中的on按钮来加载android摄像头应用程序
请,我至少需要一些经验丰富的用户的反馈。。。 这里是java类:Java 我需要通过按下unity应用程序中的on按钮来加载android摄像头应用程序,java,c#,android,unity3d,plugins,Java,C#,Android,Unity3d,Plugins,请,我至少需要一些经验丰富的用户的反馈。。。 这里是java类: package com.example.launchcameraplugin; import android.content.Intent; import android.provider.MediaStore; import androidx.appcompat.app.AppCompatActivity; public class LoadCameraPlugin extends AppCompatActivity {
package com.example.launchcameraplugin;
import android.content.Intent;
import android.provider.MediaStore;
import androidx.appcompat.app.AppCompatActivity;
public class LoadCameraPlugin extends AppCompatActivity
{
public void LaunchCameraApp(final ILoadCameraPluginCallback callback)
{
callback.LaunchCameraApp();
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);
}
}
此处为接口:
package com.example.launchcameraplugin;
public interface ILoadCameraPluginCallback
{
void LaunchCameraApp();
}
这里是C#回调代码:
public interface ILoadCameraPluginCallback
{
void LaunchCameraApp();
}
public class LoadCameraPluginCallback : AndroidJavaProxy, ILoadCameraPluginCallback
{
public event System.Action launchCameraApp;
public LoadCameraPluginCallback() :
base("com.example.launchcameraplugin.ILoadCameraPluginCallback") { }
public void LaunchCameraApp()
{
launchCameraApp?.Invoke();
}
}
下面是调用java代码的C代码:
public class LoadCameraPlugin : IDisposable
{
private AndroidJavaObject plugin;
private LoadCameraPluginCallback callback;
public LoadCameraPlugin()
{
plugin = new AndroidJavaObject("com.example.launchcameraplugin.LoadCameraPlugin");
callback = new LoadCameraPluginCallback();
}
public void Start()
{
plugin.Call("LaunchCameraApp", callback);
}
public void Dispose()
{
if(plugin != null)
{
plugin.Dispose();
}
plugin = null;
}
}
在这里,我通过按钮加载C#函数,该函数加载java代码,并在我的智能手机上加载摄像头应用程序:
public class StartPluginToLoadCameraByButton : MonoBehaviour
{
public Button button;
public GameObject ButtonOjbect;
private LoadCameraPlugin plugin;
private void Start()
{
plugin = new LoadCameraPlugin();
button = GetComponent<Button>();
button.onClick.AddListener(StartPlugin);
}
public void StartPlugin()
{
plugin.Start();
}
}
公共类StartPluginToLoadCameraByButton:MonoBehavior
{
公共按钮;
公共游戏对象按钮;
私有LoadCameraPlugin插件;
私有void Start()
{
plugin=newloadCameraPlugin();
button=GetComponent();
button.onClick.AddListener(StartPlugin);
}
public void StartPlugin()
{
plugin.Start();
}
}
我用android studio打开了我的apk文件,在那里找到了AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="0.1"
android:installLocation="2"
android:compileSdkVersion="29"
android:compileSdkVersionCodename="10"
package="com.AlexCompany.MyOS"
platformBuildVersionCode="29"
platformBuildVersionName="10">
<uses-sdk
android:minSdkVersion="24"
android:targetSdkVersion="29" />
<supports-screens
android:anyDensity="true"
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true" />
<uses-feature
android:glEsVersion="0x20000" />
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.VIBRATE" />
<uses-permission
android:name="android.permission.CAMERA" />
<uses-feature
android:name="android.hardware.camera"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.front"
android:required="false" />
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch"
android:required="false" />
<uses-feature
android:name="android.hardware.touchscreen.multitouch.distinct"
android:required="false" />
<uses-feature
android:name="android.hardware.camera.ar"
android:required="true" />
<uses-feature
android:name="com.google.ar.core.depth"
android:required="true" />
<queries>
<package
android:name="com.google.ar.core" />
</queries>
<application
android:label="@ref/0x7f060005"
android:icon="@ref/0x7f040000"
android:banner="@ref/0x7f010000"
android:isGame="true"
android:extractNativeLibs="true">
<activity
android:theme="@ref/0x7f070001"
android:name="com.unity3d.player.UnityPlayerActivity"
android:launchMode="2"
android:screenOrientation="0"
android:configChanges="0x40003fff"
android:hardwareAccelerated="false">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
<category
android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<meta-data
android:name="unityplayer.UnityActivity"
android:value="true" />
</activity>
<meta-data
android:name="unity.splash-mode"
android:value="0" />
<meta-data
android:name="unity.splash-enable"
android:value="true" />
<meta-data
android:name="unity.build-id"
android:value="faa3eba5-4901-4a5e-8e8f-ed461bf7adc5" />
<meta-data
android:name="unityplayer.SkipPermissionsDialog"
android:value="true" />
<meta-data
android:name="com.google.ar.core"
android:value="required" />
<meta-data
android:name="com.google.ar.core.min_apk_version"
android:value="210210000" />
<activity
android:theme="@ref/0x0103023a"
android:name="com.google.ar.core.InstallActivity"
android:exported="false"
android:excludeFromRecents="true"
android:launchMode="1"
android:configChanges="0x4a0" />
</application>
</manifest>
当我按下按钮时,什么也没发生。。。求求你,帮帮我,也许我做错了什么或者做了一些不合逻辑的事?提前谢谢你 好的,所以对于启动摄像头应用程序,您只能使用C#:
static int REQUEST\u IMAGE\u CAPTURE=1;
public void StartPlugin()
{
AndroidJavaClass IntentClass=新的AndroidJavaClass(“android.content.Intent”);
AndroidJavaObject IntentObject=新的AndroidJavaObject(“android.content.Intent”);
AndroidJavaObject MSObject=新的AndroidJavaObject(“android.provider.MediaStore”);
IntentObject.Call(“setAction”,MSObject.GetStatic(“ACTION\u IMAGE\u CAPTURE”);
AndroidJavaClass unity=新的AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
AndroidJavaObject currentActivity=unity.GetStatic(“currentActivity”);
currentActivity.Call(“startActivityForResult”,IntentObject,REQUEST\u IMAGE\u CAPTURE);
}
对于viber、youtube等发布应用程序,您可以使用以下代码:
public class LoadViberFromMoveMode : MonoBehaviour
{
private string package = "com.viber.voip";
public Camera ARCamera;
// Update is called once per frame
void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
// Запуск информационного луча места нажатия пальца на экран
Ray ray = ARCamera.ScreenPointToRay(touch.position);
RaycastHit hitbutton;
// Проверка пересечения луча с кнопкой
if (Input.touches[0].phase == TouchPhase.Began && Physics.Raycast(ray, out hitbutton))
{
if (hitbutton.transform.name == "LoadViber")
{
AndroidJavaClass activityClass;
AndroidJavaObject activity, packageManager;
AndroidJavaObject launch;
activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
packageManager = activity.Call<AndroidJavaObject>("getPackageManager");
launch = packageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", package);
activity.Call("startActivity", launch);
}
}
}
}
}
公共类LoadViberFromMoveMode:MonoBehavior
{
私有字符串包=“com.viber.voip”;
公共摄像机ARCamera;
//每帧调用一次更新
无效更新()
{
如果(Input.touchCount>0)
{
Touch-Touch=Input.GetTouch(0);
// Запуск информационного луча места нажатия пальца на экран
光线=ARCamera.ScreenPointRoay(触摸位置);
点击按钮;
// Проверка пересечения луча с кнопкой
if(Input.touchs[0].phase==TouchPhase.begined&&Physics.Raycast(光线,输出按钮))
{
if(hitbutton.transform.name==“LoadViber”)
{
AndroidJavaClass活动类;
AndroidJavaObject活动,packageManager;
AndroidJavaObject启动;
activityClass=新的AndroidJavaClass(“com.unity3d.player.UnityPlayer”);
activity=activityClass.GetStatic(“currentActivity”);
packageManager=activity.Call(“getPackageManager”);
launch=packageManager.Call(“getLaunchIntentForPackage”,package);
活动呼叫(“startActivity”,启动);
}
}
}
}
}
软件包可验证它是应用程序id
=)
祝您有愉快的一天 这有帮助吗?你好,阿米特克林!谢谢你的回答!我没有使用插件就解决了我的问题再次感谢你!祝你在未来的项目中好运!请在答案中写下你的答案,这样将来任何人都可以解决这个问题。好的,我今天就做<代码>=)你也是你真是太好了!这是罕见的)保持不变)
public class LoadViberFromMoveMode : MonoBehaviour
{
private string package = "com.viber.voip";
public Camera ARCamera;
// Update is called once per frame
void Update()
{
if (Input.touchCount > 0)
{
Touch touch = Input.GetTouch(0);
// Запуск информационного луча места нажатия пальца на экран
Ray ray = ARCamera.ScreenPointToRay(touch.position);
RaycastHit hitbutton;
// Проверка пересечения луча с кнопкой
if (Input.touches[0].phase == TouchPhase.Began && Physics.Raycast(ray, out hitbutton))
{
if (hitbutton.transform.name == "LoadViber")
{
AndroidJavaClass activityClass;
AndroidJavaObject activity, packageManager;
AndroidJavaObject launch;
activityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
activity = activityClass.GetStatic<AndroidJavaObject>("currentActivity");
packageManager = activity.Call<AndroidJavaObject>("getPackageManager");
launch = packageManager.Call<AndroidJavaObject>("getLaunchIntentForPackage", package);
activity.Call("startActivity", launch);
}
}
}
}
}