unity 通過安卓製作的插件打開手機相冊與選擇圖片

1.配置unity的sdk,jdk
2.下載Android stdio
3.編寫插件
4.導入插件
5.unity調用
6.打包運行

1.sdk、jdk
網上教程多的是,這裏不再贅述,但是需要注意的是,在安裝sdk的時候,你所安裝的 SDKPlatform 的API,要和Android SDK Build-tools相匹配,不然 會報錯。如下
在這裏插入圖片描述
2.Android studio 下載與安裝自行搜索百度
3.插件編寫
開始最重要的插件的編寫,這裏我們要做的是jar包
1.在Android stdio 中新建一個空項目,有兩個需要注意的地方,如下
在這裏插入圖片描述
包名必須與unity工程中的包名一樣,最低使用的API等級也要已知,否則unity打包出來的apk會閃退,當然還有可能有其他的導致閃退的原因,可以自行上網去查。
2.在MainAcitivy中將一下代碼複製進去,注意包名要使用你自己的

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);
    }

}

複製編譯之後,會有報錯,先不管,如果是第一次使用android stdio的人,可能找不到這個MainAcitivy,在Android stdio的左上角有一個切換視圖,切換到 Android視圖,一般在java下面
在這裏插入圖片描述
3.導入unity的classes.jar
這個jar包一般在你unity的安裝目錄下面,需要注意的是,你項目使用的是那個版本,那你就要導入那個版本的classes.jar
路徑一般爲:unity->Editor->Data->PlaybackEngines->AndroidPlayer->Varations->momo->Release->classes;
找到這個classes.jar之後,將其複製一份,粘貼到剛纔的android項目中的app/lib文件夾中,並且講起添加(右鍵,add as library,添加之後會彈出提示,確定是app就好了)
原因:android需要和unity進行交互,那麼就要調用unity的類才行
在這裏插入圖片描述
4.在MainActivity下面創建新的類,命名爲 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};

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

        UnityPlayer.UnitySendMessage("Main Camera", "GetPhoto", _path);
        super.onActivityResult(requestCode, resultCode, data);
         this.finish();
    }
}
需要注意的地方有一點:在打成jar包之前,你首先要確定,你這個打開手機相冊的方法到底是在那個物體上在這裏我給的是Maincamera,然後調用的是getphoto,傳過去的參數是你選擇的圖片的路徑

在這裏插入圖片描述

5.打包準備:
新建一個module-》Android Library 裏面的設置要和上面的一樣
在這裏插入圖片描述
然後將前面寫的兩個腳本放在新建的module同樣的位置,再將classes.jar也複製到module的lib裏面 ,add as library,注意包名!
在這裏插入圖片描述
編輯一下 module的 Androidmanifest.xml文件複製一下代碼

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.NXNC.Farm" >
    <!--讀取相冊權限 (必須)-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <application   >
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".WebViewActivity">
        </activity>
    </application>

</manifest>

注意包名要是自己的

在build.gradle中加上代碼,注意不是直接覆蓋原本的代碼,是追加:

task makejar(type: Copy){

    delete 'libs/test.jar'

    from('build/intermediates/packaged-classes/release/')

    into('libs')

    include('classes.jar')

    rename('classes.jar','FarmGetAndroidPhoto.jar')
}

makejar.dependsOn(build)

6.打包建議:
在android stdio安裝目錄下面找到studio.exe.vmoptions ,看看是64位的還是32位的,不管是那個,有那個就編輯那個,修改裏面的相應內容,不是全部,不是全部

-Xms2048m
-Xmx2048m
-XX:ReservedCodeCacheSize-2048m

gradle.properties註釋到這句話:
在這裏插入圖片描述
就是在前面加一個#

7.正式打包!
在terminal中輸入gradlew makehar
在這裏插入圖片描述
如果成功,會提示build successful
切換到project視圖,在新建的module的libs中會有心的jar

在導入插件之前,先用壓縮包打開生成的jar,將裏面的buildCofig.class刪除,原因是unity在使用插件打包的時候,也會生成這個文件,爲了避免不必要的錯誤,直接刪掉jar裏面的這個;

4.導入插件
在unity工程裏面的Asset 中新建文件夾Plugins-Android
Plugins 文件夾是專門用來放unity所使用的插件的,Android這個子文件夾是用來確定放什麼引擎寫出的插件的

5.unity調用

using UnityEngine;
using System.IO;
using UnityEngine.UI;

public class GetAndroidPhoto : MonoBehaviour
{
    public Button button;
    public RawImage rawImage;

    void Start ()
    {
        button.onClick.AddListener(OpenLibery);
    }

    private void OpenLibery()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
        AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
        jo.Call("TakePhoto", Application.persistentDataPath);
    }

    public void GetPhoto(string path)
    {
        Debug.Log("android give path ==> " + path);
        FileGetTex(path);
    }

    private void FileGetTex(string path)
    {
        FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
        fileStream.Seek(0, SeekOrigin.Begin);
        byte[] bye = new byte[fileStream.Length];
        fileStream.Read(bye, 0, bye.Length);
        fileStream.Close();

        Texture2D texture2D = new Texture2D((int)rawImage.rectTransform.rect.width, (int)rawImage.rectTransform.rect.height);
        texture2D.LoadImage(bye);
        rawImage.texture = texture2D;
    }
}

6.打包
注意包名與android stdio中的包名的一致性,不要用interal!要用Gradle,原因是因爲我們要和Android系統做交互,就要用這個
然後就能正確的運行demo了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章