admin 管理员组

文章数量: 887016

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/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了

本文标签: 插件 相册 手机 图片 unity