Unity中開發Android調用Android及一系列的交互

筆者最近開發Unity,U3D調用android的開發,在其中遇到了許許多多的坑,接下來我會把坑都寫出來,以及解決坑的一些辦法,這裏先起個頭,如果你也在開發遇到了了坑可以留言一起交流。待我抽出時間整理出一個DEMO。

U3D調用android調用android還需要一個重要角色那就是classes.jar包,這個是unity與Android開發的一箇中間橋樑:

需要導入到Lib中並引用,網上有說要類繼承UnityPlayerActivity這個,筆者沒有繼承,可成功。

如果你有安裝Unity,可按照這個路徑去找:(Windos) C:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin\classes.jar
 
(Mac ) Unity.app(show packages)Applications\Unity(rightclick ShowPackageContent)PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes

如果是把Android打包未arr或者jar,已打好的放入unity前需要做很重要的一步:

通過壓縮工具打開我們的jar或者AAR就是上圖這樣,這裏 的classesb不用管。

打開左側lib裏面還是會有一個classes,這裏的classes需要刪除,否則導入unity,unity在打包時就會出現衝突。

壓縮工具隨後一起上傳到CSDN,不會設置積分,放心下載。

Unity調用代碼:

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

public class aarTest : MonoBehaviour
{
    // Start is called before the first frame update
    AndroidJavaObject m_java;
    public Text text;
    private void Awake()
    {
        m_java = new AndroidJavaObject("com.u3d.com.unityAndroid.Views.Unity1Android");//com.u3d.com.unityAndroid.Views.Unity1Android 包名加類名,不能錯哦
    }
    void Start()
    {
      
    }

    // Update is called once per frame
    void Update()
    {
        
    }
    public void ArrTest1()
    {
        m_java = new AndroidJavaObject("com.u3d.com.unityAndroid.Views.Unity1Android");
        text.text = "開始調用方法";
        text.text += "\n + " + m_java;
        m_java.Call("showView");//showView方法名
        text.text += "\n 調用結束";

    }
   

}

Android部分代碼:

package com.u3d.com.unityAndroid.Views;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.u3d.com.lib.R;

import com.u3d.com.unityAndroid.AdListener.OnListener;
import com.u3d.com.unityAndroid.bean.ResultData;
import com.u3d.com.unityAndroid.bean.ResultVedioDataBean;
import com.u3d.com.unityAndroid.config.Api;
import com.u3d.com.unityAndroid.utils.AdOnClick;
import com.u3d.com.unityAndroid.utils.GetImgUtil;
import com.u3d.com.unityAndroid.utils.HttpUtils;
import com.u3d.com.unityAndroid.utils.Json;


import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

/**
 * Created by Admin on 2020/4/9.
 */

public class Unity1Android {
    public static Activity activity = null;

    private static final String[] REQUIRED_PERMISSIONS = new String[]{"android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_PHONE_STATE"};
    protected static String UA = "";
    private Activity _unityActivity;



    HttpUtils httpUtils = new HttpUtils();

    Activity getDiActivity() {
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
            return activity;
        } catch (ClassNotFoundException classNotFoundException) {

        } catch (IllegalAccessException illegalAccessException) {

        } catch (NoSuchFieldException noSuchFieldException) {
        }

        return null;
    }

   


    /**
     * 測試
     */

    public void showView() {
        final Activity curActivity = getDiActivity();
        (new Handler(curActivity.getMainLooper())).post(new Runnable() {
            @SuppressLint("ResourceType")
            public void run() {
                TextView textView = new TextView((Context) curActivity);
                textView.setText("123");
                textView.setWidth(-1);
                textView.setHeight(-1);
                textView.setBackgroundColor(curActivity.getResources().getColor(17170459));
                FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(400, 600);
                layoutParams.gravity = 17;
                ViewGroup totalView = (ViewGroup) curActivity.getWindow().getDecorView();
                totalView.addView((View) textView, (ViewGroup.LayoutParams) layoutParams);
            }
        });
    }

   
  

}

其中這個特別重要:

Activity getDiActivity() {
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
            return activity;
        } catch (ClassNotFoundException classNotFoundException) {

        } catch (IllegalAccessException illegalAccessException) {

        } catch (NoSuchFieldException noSuchFieldException) {
        }

        return null;
    }

 

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