unity打开手机相册选图并显示


整个工程界面就这样,简陋得很,目的是点击button选择图片后将图片显示在button上

看C#代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class test : MonoBehaviour
{
    // 直接拖过来button和按钮上的image
    public Button btn;
    public Image ImageView;
    AndroidJavaObject jo;
    private void Awake()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        btn.onClick.AddListener(CallAndroid);
    }
    void CallAndroid()
    {
        jo.Call("startPhoto");
        Debug.Log("点击按钮");
    }

    public void message(string str)
    {
        Debug.Log("安卓传来信息:" + str);
        StartCoroutine(LoadTexturePreview("file://" + str));
    }

    IEnumerator LoadTexturePreview(string path)
    {
        UnityWebRequest uwr = UnityWebRequestTexture.GetTexture(path);
        yield return uwr.SendWebRequest();
        Debug.Log("图片地址:" + path);
        if (uwr.isNetworkError || uwr.isHttpError)
        {
            Debug.Log("错误" + uwr.error);
        }
        else
        {

            Texture2D texture = DownloadHandlerTexture.GetContent(uwr);
            // 图片显示在按钮上
            Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f));
            ImageView.sprite = sprite;
        }
    }
}

unity这边的代码就写完了,只需要在message方法中获得到安卓传来的图片地址即可显示,下面是java代码
此处需注意,因为我只需要选取相册的系统功能,并没有新建一个安卓界面来跳转,activity_main.xml没有使用,要删除,否则的话会报错找不到一些文件

package com.gkd.pickpicture;

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 com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
// 要注意这个地方继承 UnityPlayerActivity
public class MainActivity extends UnityPlayerActivity {

    @Override
    protected 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() {
        Log.d("unity","打开相册");
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType("image/*");
        startActivityForResult(intent, 111);  // 第二个参数是请求码
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case 111:  // 请求码
                    Log.d("Unity", "相册返回");
                    UnityPlayer.UnitySendMessage("Main Camera", "message", parseUri(data));
                    Log.d("unity", parseUri(data));
                    break;
            }
        }
    }

    public String parseUri(Intent data) {
        Uri uri = data.getData();
        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();
        }

        return imagePath;  // 返回图片地址
    }
}


然后是Androidmanifest清单内容

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gkd.pickpicture">

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        // 这个地方要注意是全名  即包名+脚本名,不然的话unity调用会报错
        <activity android:name="com.gkd.pickpicture.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>
	// 获取权限
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>

然后在build.gradle中把apply plugin: 'com.android.application'替换为apply plugin: 'com.android.library',注释掉defaultConfig中的applicationId "com.gkd.pickpicture",打出aar包或者jar包,这里我使用的是aar包,将Androidmanifest和aar包放入unity的plugins下
这里需要注意一个地方,用压缩程序打开aar包查看,需要删除libs下的这个jar包,这里面放的是unity的jar包,不删除的话会报错重复引用
如果安卓的包名和unity包名一致的话还需要打开下面的classes.jar,删除里面的BuildConfig文件,
在这里插入图片描述
接下来直接运行,效果图
在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值