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

所需软件:

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

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

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

相信你看到这篇文章前已经看过类似的文章 , 但是可能你对 androidstudio 知之甚少 所以导致你无法前进  ,

废话不多说跟着我一步一步操作吧

首先是androidstudio

 

1: 创建一个空的安卓工程

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

 

2: 此处的名字和包名不重要也不会用到unity 调用Anidroid 相册 选取图片裁剪

3:创建一个安卓库用于和Unity 交互unity 调用Anidroid 相册 选取图片裁剪

 

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

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

 

4: 在libs 文件夹添加classes,jar  文件的路径  D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

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

右键点击jar 

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

 

创建一个javaclass

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

注意此处的包名  是unity多出需要使用的

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

 

package com.las.mylibrary;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
public class LoadingActivity  extends  UnityPlayerActivity {

    private static final int PHOTO_REQUEST_CODE = 1;// 相册
    public static final int PHOTORESOULT = 3;// 结果
    private Uri cropImageUri;
    private String gameObjectName;

    @Override
    protected void onCreate(Bundle bundle) {
        super.onCreate(bundle);

    }

    /**
     * Unity传值 Android Jar 接收并显示
     *
     * @param unityText
     */
    public void setUnityText( String  gameObjectName,  String unityText)
    {
        UnityPlayer.UnitySendMessage(gameObjectName, "onImagePath", "Fail"+unityText);
    }



    public void OpenPhoto(String name) {
        gameObjectName = name;
        Intent intent = new Intent(Intent.ACTION_PICK, null);
//    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
//    intent.setType("image/*");
//    intent.putExtra("crop", "true");
//    intent.putExtra("aspectX", 1);
//    intent.putExtra("aspectY", 1);
//    intent.putExtra("outputX", 100);
//    intent.putExtra("outputY", 100);
//    intent.putExtra("return-data", true);
        startActivityForResult(intent, PHOTO_REQUEST_CODE);
    }

    // 读取相册缩放图片
    public void startPhotoZoom(Uri uri) {
        if (null == uri) {
            Log.i("Unity", "读取相册缩放图片 ==>> uri为Null");
        }
        File CropPhoto = new File(getExternalCacheDir(), "crop_image.jpg");
        try {
            if (CropPhoto.exists()) {
                CropPhoto.delete();
            }
            CropPhoto.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
        cropImageUri = Uri.fromFile(CropPhoto);
//    cropImageUri = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath()
//          + "/Android/data/com.YouthGamer.WenZhou/cache/" + "crop_image.jpg");
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 添加这一句表示对目标应用临时授权该Uri所代表的文件
        }
        // 下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
        intent.putExtra("crop", "true");
        intent.putExtra("scale", true);

        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        intent.putExtra("outputX", 300);
        intent.putExtra("outputY", 300);

        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImageUri);
        // intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        Log.i("Unity", "开始缩放");
        try {
            startActivityForResult(intent, PHOTORESOULT);
        } catch (Exception e) {
            // 解决截取后部分机型秒退
            Log.i("Unity", e.getMessage());
            e.printStackTrace();
            UnityPlayer.UnitySendMessage(gameObjectName, "onImagePath", "Fail" );
        }
    }

    public void SaveBitmap(Bitmap bitmap) throws IOException {

        if(null == bitmap) {
            Log.i("Unity", "SaveBitmap=>bitmap为Null");
        }
        FileOutputStream fOut = null;
        // 注解1
        String path = "/mnt/sdcard/Android/data/com.las.mylibrary/files";
      //String path = "file://" + "/" + Environment.getExternalStorageDirectory().toString();
//    + "/Android/data/com.YouthGamer.WenZhou/files";
        try {
            // 查看这个路径是否存在,
            // 如果并没有这个路径,
            // 创建这个路径
            File destDir = new File(path);
            if (!destDir.exists()) {
                destDir.mkdirs();
            }
            fOut = new FileOutputStream(path + "/image.jpg");
        } catch (FileNotFoundException e) {
            Log.i("Unity", e.getMessage());
            e.printStackTrace();
        }
        // 将Bitmap对象写入本地路径中,Unity在去相同的路径来读取这个文件
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
        try {
            fOut.flush();
        } catch (IOException e) {
            Log.i("Unity", e.getMessage());
            e.printStackTrace();
        }
        try {
            fOut.close();
        } catch (IOException e) {
            Log.i("Unity", e.getMessage());
            e.printStackTrace();
        }
        Log.i("Unity", gameObjectName);
        UnityPlayer.UnitySendMessage(gameObjectName, "onImagePath", "image.jpg");
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (data == null)
            return;
        if (requestCode == PHOTO_REQUEST_CODE) {
            Log.i("Unity", "选取相册图片完毕");
            startPhotoZoom(data.getData());
        } else if (requestCode == PHOTORESOULT) {
            try {
                Log.i("Unity", "缩放图片完毕,准备保存Bitmap");
                Bitmap headShot = BitmapFactory.decodeStream(getContentResolver().openInputStream(cropImageUri));
                SaveBitmap(headShot);
            } catch (IOException e) {
                Log.i("Unity", e.getMessage());
                e.printStackTrace();
            }
        }
    }
}

 

粘贴上面代码时需要注意3个地方

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

 

 

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

双击build.gradle   在文件中添加一下代码保存后  更新gradle 

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

 

// 定义SDK包名称
def SDK_BASENAME = "AndroidPlugin"
// 定义SDK包版本
def SDK_VERSION = "_V1.0.0"
// SDK包生成地址
def SDK_PATH = "build/libs"
// 删除之前的Jar包 保证每一次生成的都是最新的
task deleteOldJar(type: Delete) {
    delete SDK_PATH + SDK_BASENAME + SDK_VERSION + '.jar'
}
task exportJar(type: Copy) {
    // 从源地址拷贝
    from('build/intermediates/packaged-classes/release/')
    // 存放
    into(SDK_PATH)
    // 导入
    include('classes.jar')
    // 重命名
    rename('classes.jar', SDK_BASENAME + SDK_VERSION + '.jar')
}
// 执行脚本文件
exportJar.dependsOn(deleteOldJar, build)

 

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

 

 

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

找到 exportJar  双击即可打出Jar包

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

用压缩软件打开jar包,删除其他只剩你写的文件 如下所示   完成后 即可导入Unity  至此 AS方面大功告成

 

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

 

 

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

此脚本挂载在mainCamera 上

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

 

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

 

需要注意的是jar 包中定义了回调方法的名字   但是回调到拿个物体上是需要传进去的

个人建议 你要搞懂你写的买一句代码的大概意思

 

 

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

 

unity的其他基本操作就不写了,