首页 > 解决方案 > 我需要通过按下我的统一应用程序中的按钮来加载 android 相机应用程序

问题描述

拜托,我至少需要一些更有经验的用户的反馈......这里是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();
  } 

}

我用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>

当我按下按钮时没有任何反应......请帮助,也许我做错了什么或做一些不合逻辑的事情?先感谢您!

标签: javac#androidunity3dplugins

解决方案


好的,所以对于启动相机应用程序,您只能使用 C#:

 static int REQUEST_IMAGE_CAPTURE = 1;

 public void StartPlugin()
    {
      
        
        AndroidJavaClass IntentClass = new AndroidJavaClass("android.content.Intent");
        AndroidJavaObject IntentObject = new AndroidJavaObject("android.content.Intent");

        AndroidJavaObject MSObject = new AndroidJavaObject("android.provider.MediaStore");

        IntentObject.Call<AndroidJavaObject>("setAction", MSObject.GetStatic<string>("ACTION_IMAGE_CAPTURE"));

        AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
        currentActivity.Call("startActivityForResult", IntentObject, REQUEST_IMAGE_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);
                }

            }
        }
       
    }
}

验证包是应用程序 ID 祝您=)有美好的一天!!!


推荐阅读