[Android] Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]の対応方法

Androidのアプリケーションを開発しているときに、昨日までは普通にIDE(IntelliJ/IDEA)からUSB接続した実機にアプリケーションをダウンロードして実行できていたのに、今日になって、できなくなってしまった。エラーとして、


Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]
というのがIDEに表示されている。

困ったので色々検索してみると、どうやらWindowsの場合、C:\Users\(ユーザ名)\.androidの下に、debug.keystoreというのが自動的に作成されるらしい。ここに、アプリケーションの署名に必要な証明書が格納されている。Androidでは、たとえデバッグであっても、アプリケーションは署名を付けないといけない。さらに、少なくとも次の場合は、一度インストールしたアプリケーションを再インストールしようとしても、上記メッセージが表示されて失敗する。

  • アプリケーションを異なる証明書で署名した。
  • アプリケーションの署名に使用された証明書の期限が切れた。

自動生成されるdebug.keystoreの証明書には有効期限があり、デフォルトの有効期間は1年間であるようだ。自分の場合、上記の2番目の原因でエラーが発生していた。

いろいろ対処法があるらしいが、とりあえず怠惰なプログラマとしては、もっとも楽な方法を使用した:インストールしたアプリケーションを一度アンインストールし、再度(削除後に再生成されたdebug.keystoreで署名して)インストールする。

ただ、この方法の欠点は、アプリケーションで作成されていたデータもすべて削除されてしまうことである。それが許容できれば、とりあえず一番簡単な対処法であると思う。いずれにせよ、リリースするときには正式に署名を付けるので ...

more…

androidのHttpURLConnection::getInputStreamでjava.io.FileNotFoundException

androidで、HttpURLConnectionクラスを使って、リモートサーバにGETリクエストを送り、結果を取得しようとした。だが、なぜかgetInputStreamを呼び出したところでjava.io.FileNotFoundExceptionが発生する。そのURLをブラウザでアクセスすることはできるのに。

検索してみたところ、いつものStackOverflowに答えがあった。HTTPのレスポンスコードが400以上であると、HttpURLConnectionはFileNotFoundExceptionを投げる、ということが原因だった。ブラウザでアクセスできていると思っていたが、レスポンスコードを見てみると、403 Forbiddenだった。

というわけで、同じ回答では、getResponseCode()を使って問題を特定する、ということが勧められていた。

more…

Android アプリ開発メモ

[Android] ImageViewのsetImageResourceでの描画処理

ボタンが押されたときのonClickハンドラで、何回もImageView#setImageResourceを呼び出しても、画像は更新されなかった。調べてみたら、onClickのハンドラが抜けてUIスレッドに制御が渡らないと描画されないらしい。それで、結局次のようにして解決した。まず、Runnableを実装するImageControlクラスを作成する。


public class ImageControl implements Runnable{
private ImageView iv;
private int num = 0;
ImageControl(ImageView v){ iv = v; }

@Override
public void run() {
iv.setImageResource(image[num]);

if (num >= 48){
num = 0;
}else{
num++;
iv.postDelayed(this, 10);
}
}
}

上記で、image配列はあらかじめ用意されているリソース。numが0-48の間は、postDelayedを呼び出すことで ...

more…