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类,其中btnImageView是Unity场景中的按钮和图片组件。Awake方法初始化了AndroidJavaObject实例,用于与安卓代码进行交互。CallAndroid方法用于调用安卓相册功能,CallUnityCallUnityImage方法是供安卓代码调用的回调方法,用于在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,并重写了onCreateonActivityResult方法。在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调用安卓相册并支持多选图片相关推荐

  1. Unity调用android相册获取图片或视频

    Unity调用android相册获取图片或视频 (此文章对有unity基础和对环境配置有基础的童嚡容易看懂) 因为项目上用到,在百度了很多大佬的文章后,陆陆续续踩了很多坑,可能是我哪里设置的不对,大部 ...

  2. Unity调用安卓Android的Toast

    需求:在游戏中弹窗消息,调起安卓的Toast 项目中需要做Unity和安卓交互时,经常需要通过安卓Toast来做简单的输出,以便于测试. 方法一:Unity中,C#主导 // Unity调用安卓的土司 ...

  3. android webview中h5调用 拍照/相册 通用支持代码

    android webview中h5调用 拍照/相册 通用支持代码. 在webview的   WebChromeClient 中,重写 // For Android >= 5.0 @Overri ...

  4. 一个简约的Android相册(支持多选)

    版权声明:转载必须注明本文转自严振杰的博客:http://blog.csdn.net/yanzhenjie1003 本项目开源地址:https://github.com/yanzhenjie/albu ...

  5. Unity调用安卓接口——实现复制粘贴功能

    一.知识点学习 Unity 项目中一些需要访问安卓操作系统的功能,比如获取电量,wifi 状态等,需要 Unity 启动安卓系统的 BroadcastReceiver 监听状态,并在状态更新后通知到 ...

  6. 记录Unity调用安卓及IOS拍照、相册的坑

    好久没有写文档啦,只怪自己懒.最近开发Unity的头像上传功能,在此记录过程中遇到的问题及解决方案. (一) 安卓端 1.安卓因为版本不同,在Android6.0以后,需要添加运行时访问权限,应在调用 ...

  7. unity 调用Anidroid 相册 选取图片裁剪

    所需软件: 相信你看到这篇文章前已经看过类似的文章 , 但是可能你对 androidstudio 知之甚少 所以导致你无法前进  , 废话不多说跟着我一步一步操作吧 首先是androidstudio ...

  8. unity调用安卓手机物理返回键和home键

    使用unity制作游戏时,有时候需要在游戏中触发手机的物理返回键和home键,下面在update方法中每帧监听是否按下了该键,然后写入自己要调用的方法 using System.Collections ...

  9. Web调用安卓,苹果手机摄像头,本地图片和文件

    由于要给一个客户做一个记账WAP,里面有调用手机拍照功能,这里记录一下,以供需要的朋友,下面是完整的一个HTML页面内容,放在服务器上然后浏览就可以了,只支持Chrome和Safari核的浏览器,我测 ...

最新文章

  1. php微服务rpc选择,Dora RPC:PHP 的分布式 RPC,支持微服务、服务发现
  2. 《深度学习革命》作者:GAN令我惊艳,现在的人们对AI操之过急了
  3. DIY混合BCI刺激系统:SSVEP-P300 LED刺激
  4. keil debug如何在watch直接修改变量值_printf系列教程03_SWO打印输出配置,基于Keil『Debug(printf)Viewer』...
  5. Unity3D面试——真实的面试,unity3d面试
  6. linux 创建wifi 热点_Linux创建无线WIFI热点 2.4g/5g
  7. mysql实例化_mysql多实例实例化数据库
  8. CSS3的边框(三)
  9. bzoj3160(FFT+回文自动机)
  10. 《此生未完成》痛句摘抄(4)
  11. 牛客网编程题03--明明的随机数
  12. 肌电信号的包络matlab程序_基于matlab的肌电信号处理程序
  13. 用python做数学题_「文山玩Python做测试」用python做算术题,很简单
  14. iPython的安装过程
  15. 编程程软件测试学院3周年 为你破解入职大厂的终极奥秘
  16. 强烈推荐33个 GitHub 前端学习资源
  17. 第12集 关于库卡机器人对需要减速和插值方式说明
  18. 【单片机毕业设计】【mcuclub-jj-015】基于单片机的风扇的设计
  19. ubuntu重启ssh服务
  20. 测试tcp和udp端口连通性

热门文章

  1. 研究了一下我的mt716的usb驱动
  2. android tv 新游,新游 | 《英雄之剑》TV版震撼来袭 阿里平台首发再掀全民格斗
  3. WebSocket是什么?为什么能持久连接?
  4. windows下的信息收集
  5. Visual Studio Code 代码不会自动提示
  6. UGUI DrawCall的优化 工作记录
  7. 你知道我有多么喜欢看书吗_我喜欢书
  8. 宇视摄像机——枪机壁装及护罩安装步骤
  9. 第五章 UML与数据库应用系统
  10. python 将图片切割成固定大小的图片脚本