从资源安装apk文件

时间:2014-09-17 07:52:41

标签: java android resources apk android-file

我想编写一个安装新应用程序的应用程序。此新应用程序的.apk文件包含在资源(R.raw.snake)中。 你能给我一个以编程方式安装snake.apk应用程序的代码吗? 我目前的问题是我无法以java.io.File的身份访问该文件,只能将其作为InputStream访问。 我找到了这段代码:

File file = new File(this.getFilesDir() + File.separator + "Snake.apk");
try {
     InputStream inputStream = getResources().openRawResource(R.raw.snake);
     FileOutputStream fileOutputStream = new FileOutputStream(file);

     byte buf[]=new byte[1024];
     int len;
     while((len=inputStream.read(buf))>0) {
         fileOutputStream.write(buf,0,len);
     }

     fileOutputStream.close();
     inputStream.close();
} catch (IOException e1) {}
Installer installer = new Installer(this, file);
installer.install();

但我在平板电脑屏幕上收到错误消息:

Parse error
There was a problem while parsing the package.

这是我的安装程序类:

 package de.rbg.continental.bluetoothclient2;

import java.io.File;
import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.Uri;
import android.util.Log;

public class Installer {

private static Context context = null;
private static File file = null;
public static final String PACKAGE_NAME = "de.rbg.home.snake";
private static Receiver receiver = null;
private static final String TAG = "de.rbg.continental.nfcclient3.Installer";

public Installer(Context context, File file){
    Installer.context = context;
    Installer.file = file;
}

public boolean install(){
    if (!isAppInstalled()){
        registerReceiver();
        installApk();
        return true;
    }
    return false;
}

private boolean installApk(){
    try {
        Log.v(TAG, "installing file: " + file.getPath());
        Intent intent = new Intent(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        context.startActivity(intent);
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

private boolean isAppInstalled(){
    List list = getListOfInstalledApps();
    for (int i = 0; i < list.size();i++){
        if (list.get(i).toString().contains(PACKAGE_NAME))
            return true;
    }
    return false;
}

private List getListOfInstalledApps(){
    Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
    mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
    return context.getPackageManager().queryIntentActivities( mainIntent, 0);
}

private void registerReceiver(){
    receiver = new Receiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_PACKAGE_ADDED);
    context.registerReceiver(receiver, filter);
}

public static void unregisterReceiver(){
    context.unregisterReceiver(receiver);
}

public static void onApkInstalled(){
    unregisterReceiver();
}
}

建议表示赞赏。

2 个答案:

答案 0 :(得分:1)

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() 
        + "<Path To Your APK>")), 
    "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

答案 1 :(得分:0)

现在我发现错误是由清单文件中缺少的权限引起的:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />