Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我需要通过按下unity应用程序中的on按钮来加载android摄像头应用程序_Java_C#_Android_Unity3d_Plugins - Fatal编程技术网

Java 我需要通过按下unity应用程序中的on按钮来加载android摄像头应用程序

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 {

请,我至少需要一些经验丰富的用户的反馈。。。 这里是java类:

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);
                }

            }
        }
       
    }
}