Unity调用安卓相册并支持多选图片
Unity调用安卓相册并支持多选图片
当在Unity中开发Android应用时,有时需要使用安卓设备的相册功能,以便用户可以选择并上传图片。本篇博客将介绍如何在Unity中调用安卓相册,并支持多选图片。
本来用AndroidStudio打出个aar的包来着,但是老是闪退,没有找到原因,就只能直接调java脚本了。
我Unity版本是2022.1.23;
首先,我们需要创建一个安卓插件,用于在Unity中调用安卓相册功能。在Unity中创建一个C#脚本,命名为ImagePicker.cs,代码如下:
using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;public class ImagePicker : MonoBehaviour
{// 直接拖过来button和按钮上的imagepublic Button btn;AndroidJavaObject jo;public Button getImage;private void Awake(){AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");jo = jc.GetStatic<AndroidJavaObject>("currentActivity");btn.onClick.AddListener(() => {CallAndroid(123456);});getImage.onClick.AddListener(() =>{CallAndroid(123666);});}/// <summary>/// CALL>>>ANDROID>>>打开相册/// </summary>void CallAndroid(int num){jo.Call("startPhoto", num);}/// <summary>/// 给Android调用的方法/// </summary>/// <param name="str"></param>public void CallUnity(string str){string[] path = str.Split(',');jo.Call("CallAndroid", string.Format("图片Address>>>>" + str));}public void CallUnityImage(string str){jo.Call("CallAndroid", string.Format("背景图片Address>>>>" + str));}
}
上述代码定义了一个ImagePicker
类,其中btn
和ImageView
是Unity场景中的按钮和图片组件。Awake
方法初始化了AndroidJavaObject实例,用于与安卓代码进行交互。CallAndroid
方法用于调用安卓相册功能,CallUnity
和CallUnityImage
方法是供安卓代码调用的回调方法,用于在Unity中显示图片。
切记:此C#脚本一定要挂载到java脚本中所传输的物体名的物体上。
接下来,我们需要在安卓环境中创建一个Java类,用于处理相册相关的功能。在安卓项目中创建一个名为MainActivity的类,代码如下:
// 这里是一段安卓代码,用于调用相册和获取选中的图片路径
// 代码中涉及到权限申请、相册调用和获取图片路径的操作package com.pub.dou;import android.Manifest;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Toast;import android.app.Activity;import java.net.URI;import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;public class MainActivity extends UnityPlayerActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 获取存储权限,否则无法获取图片if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, 100);}}// Unity点击按钮触发这个方法public void startPhoto(int result) {Log.d("unity", "打开相册");Intent intent = null;if (result == 123456) {intent = new Intent(Intent.ACTION_GET_CONTENT);} else if (result == 123666) {intent = new Intent(Intent.ACTION_GET_CONTENT);}intent.setType("image/*");intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);intent.addCategory(Intent.CATEGORY_OPENABLE);startActivityForResult(intent, result); // 第二个参数是请求码}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == RESULT_OK) {switch (requestCode) {case 123456: // 请求码Log.d("Unity", "相册返回");UnityPlayer.UnitySendMessage("Main Camera", "CallUnity", GetManyPath(data));break;case 123666: // 请求码Log.d("Unity", "相册返回");UnityPlayer.UnitySendMessage("Main Camera", "CallUnityImage", GetManyPath(data));break;}}}public String GetManyPath(Intent data) {Uri[] imageUris = null;if (data.getClipData() != null) {int count = data.getClipData().getItemCount();imageUris = new Uri[count];for (int i = 0; i < count; i++) {imageUris[i] = data.getClipData().getItemAt(i).getUri();}} else if (data.getData() != null) {imageUris = new Uri[]{data.getData()};}if (imageUris != null) {StringBuilder uriString = new StringBuilder();for (Uri uri : imageUris) {String imagePath;Cursor cursor = getContentResolver().query(uri, new String[]{MediaStore.Images.ImageColumns.DATA},null, null, null);if (cursor == null) {imagePath = uri.getPath();} else {cursor.moveToFirst();int index = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);imagePath = cursor.getString(index);cursor.close();}uriString.append(imagePath).append(",");}if (uriString.length() > 0) {uriString.deleteCharAt(uriString.length() - 1);}return uriString.toString();}return null;}// 让Unity调用的方法public void CallAndroid(String Msg) {Toast.makeText(MainActivity.this, Msg, Toast.LENGTH_SHORT).show();}
}
上述代码中的MainActivity
类继承自UnityPlayerActivity
,并重写了onCreate
和onActivityResult
方法。在onCreate
方法中,首先调用requestPermissions
方法申请存储权限。在startPhoto
方法中,根据传入的result
参数决定打开相册的类型。在onActivityResult
方法中,根据请求码和结果码处理相册返回的数据,并使用UnityPlayer.UnitySendMessage
方法将图片路径传递给Unity。
切记:例如UnityPlayer.UnitySendMessage(“Main Camera”, “CallUnityImage”, GetManyPath(data)); 此处的Main Camera 是Unity中挂在调用按照脚本的物体名!CallUnityImage是Main Camera物体下脚本中的回参方法。
对了还有AndroidManifest.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.pub.dou"><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><applicationandroid:allowBackup="true"android:label="@string/app_name"android:requestLegacyExternalStorage="true"android:supportsRtl="true"><activity android:name="com.pub.dou.MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter>// 和unity交互需要加这一句<meta-data android:name="unityplayer.UnityActivity" android:value="true" /></activity></application></manifest>
MainActivity.java文件与AndroidManifest.xml文件要放在下图位置:
这就可以调起相册进行多个选择啦。
这三个脚本我放在这里了有需要的可以自取。Unity调用安卓相册进行多选
Unity调用安卓相册并支持多选图片相关推荐
- Unity调用android相册获取图片或视频
Unity调用android相册获取图片或视频 (此文章对有unity基础和对环境配置有基础的童嚡容易看懂) 因为项目上用到,在百度了很多大佬的文章后,陆陆续续踩了很多坑,可能是我哪里设置的不对,大部 ...
- Unity调用安卓Android的Toast
需求:在游戏中弹窗消息,调起安卓的Toast 项目中需要做Unity和安卓交互时,经常需要通过安卓Toast来做简单的输出,以便于测试. 方法一:Unity中,C#主导 // Unity调用安卓的土司 ...
- android webview中h5调用 拍照/相册 通用支持代码
android webview中h5调用 拍照/相册 通用支持代码. 在webview的 WebChromeClient 中,重写 // For Android >= 5.0 @Overri ...
- 一个简约的Android相册(支持多选)
版权声明:转载必须注明本文转自严振杰的博客:http://blog.csdn.net/yanzhenjie1003 本项目开源地址:https://github.com/yanzhenjie/albu ...
- Unity调用安卓接口——实现复制粘贴功能
一.知识点学习 Unity 项目中一些需要访问安卓操作系统的功能,比如获取电量,wifi 状态等,需要 Unity 启动安卓系统的 BroadcastReceiver 监听状态,并在状态更新后通知到 ...
- 记录Unity调用安卓及IOS拍照、相册的坑
好久没有写文档啦,只怪自己懒.最近开发Unity的头像上传功能,在此记录过程中遇到的问题及解决方案. (一) 安卓端 1.安卓因为版本不同,在Android6.0以后,需要添加运行时访问权限,应在调用 ...
- unity 调用Anidroid 相册 选取图片裁剪
所需软件: 相信你看到这篇文章前已经看过类似的文章 , 但是可能你对 androidstudio 知之甚少 所以导致你无法前进 , 废话不多说跟着我一步一步操作吧 首先是androidstudio ...
- unity调用安卓手机物理返回键和home键
使用unity制作游戏时,有时候需要在游戏中触发手机的物理返回键和home键,下面在update方法中每帧监听是否按下了该键,然后写入自己要调用的方法 using System.Collections ...
- Web调用安卓,苹果手机摄像头,本地图片和文件
由于要给一个客户做一个记账WAP,里面有调用手机拍照功能,这里记录一下,以供需要的朋友,下面是完整的一个HTML页面内容,放在服务器上然后浏览就可以了,只支持Chrome和Safari核的浏览器,我测 ...
最新文章
- php微服务rpc选择,Dora RPC:PHP 的分布式 RPC,支持微服务、服务发现
- 《深度学习革命》作者:GAN令我惊艳,现在的人们对AI操之过急了
- DIY混合BCI刺激系统:SSVEP-P300 LED刺激
- keil debug如何在watch直接修改变量值_printf系列教程03_SWO打印输出配置,基于Keil『Debug(printf)Viewer』...
- Unity3D面试——真实的面试,unity3d面试
- linux 创建wifi 热点_Linux创建无线WIFI热点 2.4g/5g
- mysql实例化_mysql多实例实例化数据库
- CSS3的边框(三)
- bzoj3160(FFT+回文自动机)
- 《此生未完成》痛句摘抄(4)
- 牛客网编程题03--明明的随机数
- 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序
- 用python做数学题_「文山玩Python做测试」用python做算术题,很简单
- iPython的安装过程
- 编程程软件测试学院3周年 为你破解入职大厂的终极奥秘
- 强烈推荐33个 GitHub 前端学习资源
- 第12集 关于库卡机器人对需要减速和插值方式说明
- 【单片机毕业设计】【mcuclub-jj-015】基于单片机的风扇的设计
- ubuntu重启ssh服务
- 测试tcp和udp端口连通性