java - 我需要通过按下我的统一应用程序中的按钮来加载 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>
当我按下按钮时没有任何反应......请帮助,也许我做错了什么或做一些不合逻辑的事情?先感谢您!
解决方案
好的,所以对于启动相机应用程序,您只能使用 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 祝您=)
有美好的一天!!!
推荐阅读
- php - 实时mysql无限滚动
- android - How do I specify a minimum ram requirement for my app
- multiprocessing - 是否有任何计算可以*仅*结合两个或多个并行进程进行?
- cordova - in-memory DB (lokiJS) vs regular indexedDB
- jquery - Jquery - inArray - Check value exists or not after compare
- css - 使用 BEM 时的媒体查询
- c# - WPF InitializeComponent() 在使用 SplashScreen Buid Action 添加图像时给出 CS0103 错误
- html - 居中标题上的 CSS 伪元素下划线
- glassfish - 尝试启动 Eclipse GlassFish 5.1.0 - 建议的主密码不起作用
- multithreading - 多线程多用户环境中的 C++ 执行时间