1

I want to write an Application that installs a new Application. The .apk file for this new Application is included in the resources (R.raw.snake). Can you give me the code for installing the snake.apk Application programmatically? My current problem is that I cannot access the file as java.io.File but only as InputStream. I found this code:

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();

But I receive an error message on my tablet screen:

Parse error
There was a problem while parsing the package.

This is my Installer class:

 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();
}
}

Suggestions are appreciated.

Garrarufa
  • 1,145
  • 1
  • 12
  • 29

2 Answers2

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);
Binoy Babu
  • 16,699
  • 17
  • 91
  • 134
Hardik Chauhan
  • 2,750
  • 15
  • 30
  • this is not what i need. i know how to install an apk file, but i don't know how to install an apk file that is stored as a resource file – Garrarufa Sep 17 '14 at 08:07
0

Now I found out that the error was caused by the missing permissions in the manifest file:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Garrarufa
  • 1,145
  • 1
  • 12
  • 29