admin管理员组文章数量:1558041
编写不易,如有转载,请声明出处:http://blog.csdn/zxc514257857/article/details/77485561
前言
需要获取Root权限,安装过程有安装界面显示,不是静默安装,静默安装下篇博客介绍
全部代码
// MainActivity
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.Uri;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private String tempPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.apk";
private PackageInfo mPackageInfo;
private Context mContext = MainActivity.this;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(RootUtils.isRooted()) {
// 从assets目录中获取apk并安装
installFromAssets();
}
}
/**
* 从assets目录中获取apk并安装
*/
public void installFromAssets(){
try {
// 根据包名判断是否安装 如果未找到包名说明包名输入错误或未安装
// 想要安装的apk的名字是testapk,其包名为com.testapk.apk
mPackageInfo = getPackageManager().getPackageInfo("com.testapk.apk", 0);
} catch (Exception e) {
mPackageInfo = null;
e.printStackTrace();
}
if (mPackageInfo == null) {
// 启用安装新线程
new Thread(new Runnable() {
@Override
public void run() {
Log.i(TAG , "未安装进行安装");
// 传统安装(安装其他软件或自己的升级版 有安装界面显示) 并启动
normalInstall(mContext);
}
}).start();
} else {
Log.i(TAG , "已经安装");
}
}
/**
* 传统安装
*
* @param context
*/
public void normalInstall(Context context) {
// 进行资源的转移 将assets下的文件转移到可读写文件目录下
createFile();
File file = new File(tempPath);
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
context.startActivity(intent);
startApp(mContext);
}
/**
* 进行资源的转移 将assets下的文件转移到可读写文件目录下
*/
public void createFile() {
InputStream is = null;
FileOutputStream fos = null;
try {
// 从assets文件夹中获取testapk.apk文件
is = getAssets().open("testapk.apk");
File file = new File(tempPath);
file.createNewFile();
fos = new FileOutputStream(file);
byte[] temp = new byte[1024];
int i = 0;
while ((i = is.read(temp)) > 0) {
fos.write(temp, 0, i);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 安装后自启动apk
* @param context
*/
private static void startApp(Context context) {
execRootShellCmd("am start -S " + context.getPackageName() + "/"
+ MainActivity.class.getCanonicalName() + " \n");
}
/**
* 执行shell命令
*
* @param cmds
* @return
*/
private static boolean execRootShellCmd(String... cmds) {
if (cmds == null || cmds.length == 0) {
return false;
}
DataOutputStream dos = null;
InputStream dis = null;
Process p = null;
try {
// 经过Root处理的android系统即有su命令
p = Runtime.getRuntime().exec("su");
dos = new DataOutputStream(p.getOutputStream());
for (int i = 0; i < cmds.length; i++) {
dos.writeBytes(cmds[i] + " \n");
}
dos.writeBytes("exit \n");
int code = p.waitFor();
return code == 0;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (dos != null) {
dos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (dis != null) {
dis.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
try {
if (p != null) {
p.destroy();
p = null;
}
} catch (Exception e3) {
e3.printStackTrace();
}
}
return false;
}
}
----------------------------------------------------------------------------------------
// RootUtils
import android.util.Log;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
public class RootUtils {
public static final String TAG = "RootUtils";
@Deprecated
public static boolean isRooted() {
Process process = null;
try {
process = Runtime.getRuntime().exec("su");
OutputStream outputStream = process.getOutputStream();
InputStream inputStream = process.getInputStream();
outputStream.write("id\n".getBytes());
outputStream.flush();
outputStream.write("exit\n".getBytes());
outputStream.flush();
process.waitFor();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String s = bufferedReader.readLine();
if (s.contains("uid=0")) return true;
} catch (IOException e) {
Log.e(TAG, "没有root权限");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (process != null)
process.destroy();
}
return false;
}
public static boolean checkRooted() {
boolean result = false;
try {
result = new File("/system/bin/su").exists() || new File("/system/xbin/su").exists();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
Demo下载请移步:http://download.csdn/download/zxc514257857/9945466
因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!
版权声明:本文标题:Android在一个app中实现另一个app的自动安装,安装完成后自动打开(需Root) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dongtai/1727319460a1108168.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论