最近在学习android的知识,因为功能的需要,unity3d 要和android交互。最近公司的项目中遇到了unity3d 开发的app需要更新和自动安装的功能,但是使用unity3d是实现不了这样的功能的。这个时候就想到使用android原有的知识进行开发,然后打成jar包,导成插件,放到unity3d中去调用。
1.首先在eclipse或者android studio 中开发原有的app下载更新的功能。
*我这里是以eclipse为例开发的。
首先在eclipse中导入unity3d的jar包,class.jar,这里的class.jar在unity3d安装目录下,如下:D:\Unity5.2.3SetUp\Editor\Data\PlaybackEngines\androidplayer\Variations\il2cpp\Development\Classes
然后就要写相应的代码了,android的原有下载更新网上也有很多但是没有结合Untiy3d。具体的代码如下,首先要引入import com.unity3d.player.UnityPlayer,然后activity继承UnityPlayerActivity
package com.example.downapk;
import java.io.File;
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends UnityPlayerActivity
{
private static String tag = "MainActivity";
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
OpenFile();
break;
default:
break;
}
}
};
private AsyncTaskUtil mDownloadAsyncTask;
public float size;
public static MainActivity instance;
public static MainActivity getInstance()
{
return instance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
}
public void SetSize(float size)
{
size = this.size;
Log.d(tag, this.size+"");
}
public void StartLoad(String httpUrl, String apkName)
{
mDownloadAsyncTask = new AsyncTaskUtil(MainActivity.this, mHandler);
mDownloadAsyncTask.execute(httpUrl, apkName);//必须传入两个参数——参数1:url;参数2:文件名(可以为null)
}
private void OpenFile() {
String str = "/test.apk";
String fileName = mDownloadAsyncTask.getFolderPath() + str;
File file = new File(fileName);
if (!file.exists()) {
Log.d("URL", "fileName:" + fileName);
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
Log.d("URL", "fileName:" + fileName);
startActivity(intent);
}
}
上面代码是主activity 表黑部分是要在unity中调用的。调用可以是一个按钮,例如
AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("StartLoad", ParentApp.getInstance().updateUrl, "test.apk");
这里是使用AsyncTask进行下载的,在后来可以看到下载进度。下面下载的代码。
package com.example.downapk;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;
import com.unity3d.player.UnityPlayer;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Environment;
import android.os.Handler;
import android.util.Log;
import android.widget.Toast;
public class AsyncTaskUtil extends AsyncTask<String, Double, Boolean>
{
public