unity 调用Anidroid 相册 选取图片裁剪
所需軟件:
相信你看到這篇文章前已經看過類似的文章 , 但是可能你對 androidstudio 知之甚少 所以導致你無法前進? ,
廢話不多說跟著我一步一步操作吧
首先是androidstudio
?
1: 創建一個空的安卓工程
?
2: 此處的名字和包名不重要也不會用到
3:創建一個安卓庫用于和Unity 交互
?
?
4: 在libs 文件夾添加classes,jar? 文件的路徑? D:\Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
右鍵點擊jar?
?
創建一個javaclass
注意此處的包名? 是unity多出需要使用的
?
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;@Overrideprotected 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 detectionLog.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;// 注解1String 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");}@Overrideprotected 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個地方
?
?
雙擊build.gradle? ?在文件中添加一下代碼保存后? 更新gradle?
?
// 定義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)?
?
?
找到 exportJar? 雙擊即可打出Jar包
用壓縮軟件打開jar包,刪除其他只剩你寫的文件 如下所示? ?完成后 即可導入Unity? 至此 AS方面大功告成
?
?
?
此腳本掛載在mainCamera 上
?
?
需要注意的是jar 包中定義了回調方法的名字? ?但是回調到拿個物體上是需要傳進去的
個人建議 你要搞懂你寫的買一句代碼的大概意思
?
?
?
unity的其他基本操作就不寫了,
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的unity 调用Anidroid 相册 选取图片裁剪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dpi和ppi换算_八一八那些px、pt
- 下一篇: win7和ubuntu关闭防火墙方法