Unity调用相册

本文详细介绍了如何在Unity中调用安卓和iOS系统的相册功能。在安卓端,你需要创建一个Android工程,配置相应的包名和API等级,编写Java代码并导入Unity的classes.jar。在Unity中打包时可能会遇到Dex错误,解决方法是删除jar包中的buildconfig.class。对于iOS,只需在Unity的Plugins-iOS目录下放置两个文件,添加相应权限即可。
摘要由CSDN通过智能技术生成

安卓:
一、准备jar包,供Unity使用

Unity和Android交互,这个jar包就是一个中间商,也就是说,我们获取相册里的相片路径,并告知Unity这个路径,这一部分功能在安卓端实现

(1)androidstudio新建工程,这一系列没有什么好说的,新建一个空工程,值得注意是下图圈起来的两个地方,packagename==>这个必须要和你的Unity工程的包名一样,

不然打出来的包安装完成后会闪退的,还有就是最低支持的API等级,这个也必须和Unity里面的buildsetting里面的对应
在这里插入图片描述

(2)接下来在MainAcitivy里面复制我下面的代码,这里要注意在复制代码的时候,第一行是包名,这里被我删了,因为每个人包名都不一样,包名需要保留,不能没有

之后你会发现TakePhoto是灰色的,不用管它,这个Unity调用android的入口,这个函数名要是改了话,Unity的C#代码也需要改对应的,不然调不到

然后你还会发现WebViewActivity和UnityPlayerActivity报错,先别慌,稳住,看下一步!

import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import com.unity3d.player.UnityPlayerActivity;

public class MainActivity extends UnityPlayerActivity{
   
    private static String LOG_TAG = "LOG_My";
    Context mContext = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
   
        super.onCreate(savedInstanceState);
        mContext = this;
    }

    //Unity中会调用这个方法,用于打开本地相册
    public void TakePhoto(String str)
    {
   
        Log.d(LOG_TAG,str);
        Intent intent = new Intent(mContext,WebViewActivity.class);
        this.startActivity(intent);
    }

}

(3)导入Unity的classes.jar

先说这个文件在哪,在你所使用的Unity的安装目录里面,这里需要注意呀,不是什么版本的Unity的这个classes.jar都能用的,必须是你Unity工程所使用的版本的安装目录在这里插入图片描述
将这个jar包赋值一份,并拷贝到刚才新建的Android项目的app\libs文件夹里点击左上角的Android图片,切换到project视图就能找到这个文件夹在这里插入图片描述
然后右键这个classes.jar,选择add as library,会弹出一个框,确定是给app添加的就行,确定后等待编译一会,UnityPlayerActivity就会正常了,这是因为Android需要和Unity通信,就必须得调用Unity的类才行

(4)创建WebViewActivity类,切换回Android视图找到我们的MainActivty,这个都会在app\java\第一个包名的文件夹下

然后右键,new一个javaclass,命名就是WebViewActivity,创建的时候什么都不用管,都是默认就行
在这里插入图片描述
然后你就会看到什么报错都没了,接下来把下面的代码复制到WebViewActivity,这里还是一样不能自己的包名给粘贴调哈

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.KeyEvent;

import com.unity3d.player.UnityPlayer;

import java.io.IOException;


public class WebViewActivity extends Activity
{
    public static final int NONE = 0;

    public static final int PHOTORESOULT = 3;

    public static final String IMAGE_UNSPECIFIED = "image/*";



    private String LOG_TAG = "LOG_ZDQ";
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        Intent intent = new Intent(Intent.ACTION_PICK, null);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
        startActivityForResult(intent, PHOTORESOULT);
        Log.d(LOG_TAG, "打开相册!");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.d(LOG_TAG, "resultCode :" + resultCode);
        if (resultCode == NONE)
            return;

        if (data == null)
            return;

        
        ContentResolver resolver = getContentResolver();
        Bitmap bm=null;
        
        Uri originalUri = data.getData();
        try {
            bm = MediaStore.Images.Media.getBitmap(resolver, originalUri);
        } catch (IOException e) {
            e.printStackTrace();
        }


        String[] proj = {MediaStore.Images.Media.DATA};

        65         
        Cursor cursor= getContentResolver().query(originalUri,proj,null,null,null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
70         cursor.moveToFirst();
72         String _path = cursor.getString(column_index);

        UnityPlayer.UnitySendMessage("Main Camera", "GetPhoto", _path);
        super.onActivityResult(requestCode, resultCode, data);
78         this.finish();
    }
}

这里需要注意的地方
在这里插入图片描述
这是调用Unity的main camera 上的脚本里的Getphoto方法,path是传递过去的参数

unity里面需要在什么地方加这个功能,以及脚本挂载什么对象身上,这些都要先考虑好之后才能打这个jar包,到这里第一阶段Android的功能已经写完了,接下来就是打包了,坑较多,一定要注意了

(5)准备打jar包,新建module file - new - new module - Android Library - next 这里的packagename和最小版本sdk也要设置一下和上面的一样

然后之前写的两个脚本复制到你新建的module的同样的位置,然后切换

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Unity调用Android相册可以通过编写本地插件来实现。以下是一种方法: 首先,创建一个Java类作为我们的本地插件。在Android Studio中,创建一个新的Java类文件,并添加以下代码: ```java import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; public class GalleryPlugin { public static void OpenGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/jpeg", "image/png"}); UnityPlayer.currentActivity.startActivityForResult(intent, 1); } } ``` 然后,在Unity中创建一个C#脚本来调用这个本地插件。在脚本中,我们将使用`DllImport`来导入Android库,并定义一个静态方法来调用Java类中的方法: ```csharp using System.Runtime.InteropServices; public class AndroidGallery : MonoBehaviour { [DllImport("gallery_plugin")] private static extern void OpenGallery(); public void OpenAndroidGallery() { OpenGallery(); } } ``` 在Unity中创建一个UI按钮,并将其连接到`OpenAndroidGallery`方法。这样,当我们点击按钮时,将调用本地插件的方法。 最后,将生成的Java类文件和C#脚本文件分别放在对应的目录中,并导出到Android项目中。 通过这种方式,我们可以在Unity调用Android相册,并允许用户选择图片。一旦用户选择了图片,可以使用Unity的处理方法进行后续操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值