AndroidアプリケーションはAndroidマーケットからのみではなく、それ以外の手段でも
インストールすることが可能です。たとえば、SDカードなどの領域に保存しているapkを
アプリケーション上からインストールすることができます。
これによりたとえば、Androidマーケットに公開できないアプリ(アップロード上限を超えてしまうサイズのアプリのような)を公開したい場合や、独自のマーケットで公開したい場合などに利用することが可能です。
詳しい解説は続きからどうぞ。
MIME typeを指定する
apkのインストールはMIME typeに
application/vnd.android.package-archiveを指定したIntentを発行するだけです。
たとえばSDカード上に保存されているapkをインストールしたい場合には以下のようにします。
String fileName = Environment.getExternalStorageDirectory() + "/myApp.apk"; Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive"); startActivity(intent);
2行目でIntentを生成し、3行目でapkファイルとMIME typeを指定しています。
4行目でIntentを発行するとアプリケーションのインストール画面が表示され、
ユーザにインストールの確認を行います。
Webサーバ上のapkをインストールする
ここで、サンプルコードとしてWebサーバ上に公開しているapkを自動で
ダウンロード・インストールする方法についてご紹介します。
アプリケーション上のボタンを押すとWebサーバ(ここでは例としてhttp://hogehoge.com/myApp.apk)から
apkをダウンロードしインストールを開始します。
public class InstallAPKActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// パフォーマンス低下を検出する機能を無効にしておく
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().permitAll().build());
Button button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ダウンロード・インストール開始
download("http://hogehoge.com/myApp.apk");
}
});
}
/**
ダウンロード・インストールメソッド
*/
public void download(String apkurl) {
try {
// URL設定
URL url = new URL(apkurl);
// HTTP接続開始
HttpURLConnection c = (HttpURLConnection) url.openConnection();
c.setRequestMethod("GET");
c.connect();
// SDカードの設定
String PATH = Environment.getExternalStorageDirectory() + "/download/";
File file = new File(PATH);
file.mkdirs();
// テンポラリファイルの設定
File outputFile = new File(file, "app.apk");
FileOutputStream fos = new FileOutputStream(outputFile);
// ダウンロード開始
InputStream is = c.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
fos.close();
is.close();
// Intent生成
Intent intent = new Intent(Intent.ACTION_VIEW);
// MIME type設定
intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/" + "app.apk")), "application/vnd.android.package-archive");
// Intent発行
startActivity(intent);
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
8行目で、StrictModeと呼ばれるパフォーマンス低下を検出する機能を無効にする命令を記述しています。
今回のテーマと直接は関係ないですが、Android 3.0以降メインスレッドから
ネットワーク通信を行うとStrictModeによってandroid.os.Networkonmainthreadexception例外に
なってしまいます。本来はダウンロード処理は別スレッドにするべきですが、
今回はサンプルということでStrictModeを無効にすることで回避しています。
次にボタンが押されたときにダウンロード・インストールするように16行目で
後述するdownloadメソッドを呼び出しています。
24行目からdownloadメソッドを定義しています。
29行目〜32行目でHttpURLConnectionクラスを使ってHTTP接続を開始します。
(HttpURLConnectionクラスを利用したHTTP通信については「HttpURLConnectionを使用してHTTP通信を行う」を参考にして下さい)
34行目〜41行目にかけて、apkのダウンロード先となるSDカードのパスを設定します。
44行目でapkをダウンロードします。
そして53行目〜58行目でMIME typeを設定したIntentを発行し、ダウンロードしたapkのインストールを行います。

