Android Studio 1:在项目的res目录下创建xml目录,再创建file_paths.xml文件。
<?xml version="1.0" encoding="utf-8"?>
<paths>
<root-path name="root" path="" />
<external-path name="external_storage_root" path="." />
<external-path name="external_storage_download" path="Download" />
</paths>
2.更改Androidmainfest文件
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.luoyikun.installapk">
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<application
android:allowBackup="true">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="cn.com.woong.resultbackdemo.fileProvider"
android:exported="false"
android:grantUriPermissions="true"
tools:ignore="WrongManifestParent">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>
</application>
</manifest>
红线部分替换为你应用的包名
3:java源码
package com.luoyikun.installapk;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.FileProvider;
import com.unity3d.player.UnityPlayer;
import java.io.File;
public class InstallApk extends Fragment {
private static final String TAG = "InstallApk";
String m_gameObjectName;
String m_funcName;
private Context unityContext;
private Activity unityActivity;
public void UnityFunc(String gameObjectName, String funcName)
{
m_gameObjectName = gameObjectName;
m_funcName = funcName;
}
public static InstallApk GetInstanceByAndroid(Activity activity,Context context)
{
if (Instance == null)
{
Instance = new InstallApk();
Instance.unityActivity = activity;
Instance.unityContext = context;
activity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
private static InstallApk Instance = null;
public static InstallApk GetInstance()
{
if(Instance == null)
{
Instance = new InstallApk();
Instance.unityActivity = UnityPlayer.currentActivity;
Instance.unityContext = Instance.unityActivity.getBaseContext();
UnityPlayer.currentActivity.getFragmentManager().beginTransaction().add(Instance, TAG).commit();
}
return Instance;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true); // 这一句很重要,保存对该Fragment的引用,防止在旋转屏幕等操作时时丢失引用(Fragment隶属于Activity)
}
// 调用 Unity
// gameObjectName 为接受消息的Unity 中 GameObject 的名字
// functionName 为接受消息的GameObject 挂载 C# 脚本中的函数名
// _content 为发送给Unity 的内容
public void CallUnity( String _content)
{
UnityPlayer.UnitySendMessage(m_gameObjectName, m_funcName, _content);
}
public void installApp(String path){
File pFile = new File(path);
if (null == pFile)
return;
if (!pFile.exists())
return;
Intent _Intent = new Intent();
_Intent.setAction(Intent.ACTION_VIEW);
Uri _uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
_Intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
_uri = FileProvider.getUriForFile(unityContext, unityContext.getPackageName() + ".fileProvider", pFile);
}else {
_uri = Uri.fromFile(pFile);
_Intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
_Intent.setDataAndType(_uri, "application/vnd.android.package-archive");
unityContext.startActivity(_Intent);
}
}
unity: 1.在unity需要导入android-support-v4.jar、android-support-v7-appcompat.jar包
2.调用
public static void InstallApk(string path)
{
AndroidJavaObject pluginObject = new AndroidJavaClass("com.luoyikun.installapk.InstallApk").CallStatic<AndroidJavaObject>("GetInstance");
pluginObject.Call("installApp", path);
}
需要注意的是如果使用unity的Application.persistentDataPath会在路径的最前面多个 : ,这个在安卓端是不认的,所以
string path = dataPath + apkName;
path = path.Replace(":", "");
AndroidFunc.InstallApk(path);