事象の水平線

横を無理やり伸ばしたので、デザインがおかしいけど、気にしない。完璧に時代に取り残されたHTMLをいまさらいじるのがめんどくさい。個人的ブックマーク代わりなメモ書きブログ。

BNP-500の分割Romを何とかしようとrooted後、Eclipseからデバッグしようとしたら、
Installation failed due to invalid APK file!
といわれて、ADB経由でインストールが出来ない。

で、結論はStack Overflowの以下にありました。
Permission denied causing “Installation failed due to invalid APK file”
Eclipse installation failed due to invalid APK file?

Try this over ADB:

# cd /data/local
# mv tmp tmp-old # (or simply rm -rf tmp)
# mkdir /mnt/sdcard/tmp
# ln -s /mnt/sdcard/tmp ./tmp


ということ。
詳しくは、Stack Overflow を読んでください。

当初、端末のターミナルからやってだめでしたが、PCからADB経由でうまくいきました。

PageTop
Activityに拠らない画面切り替えの方法 2種類
両方とも見えているViewを切り替える。という考え方。
ソースのimportは省略。レイアウトにxmlは使わない派です。

その1:setContentView()を使ってViewを切り替える方法
public class MainActivity extends Activity implements android.view.View.OnClickListener {	

private LinearLayout _firstLayout;
private LinearLayout _secondLayout;
private Button _firstButton;
private Button _secondButton;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Context context = getApplicationContext();

_firstLayout = new LinearLayout(context);
_firstButton = new Button(context);
_firstLayout.addView(_firstButton);
_firstLayout.setBackgroundColor(Color.CYAN);
_firstButton.setText("1st button");
_firstButton.setOnClickListener(this);

_secondLayout = new LinearLayout(context);
_secondButton = new Button(context);
_secondLayout.addView(_secondButton);
_secondLayout.setBackgroundColor(Color.GREEN);
_secondButton.setText("2nd button");
_secondButton.setOnClickListener(this);

setContentView(_firstLayout);

}

@Override
public void onClick(View v) {
if(v == _firstButton){
setContentView(_secondLayout);
}else if(v == _secondButton){
setContentView(_firstLayout);
}
}
}


その2:FrameLayoutにViewを重ねておいて、重ね順を変えることで、手前に見えているViewを切り替える方法
必要であればView.setVisibility(int visibility)も併用
public class MainActivity extends Activity implements android.view.View.OnClickListener {	

private FrameLayout _rootLayout;
private LinearLayout _firstLayout;
private LinearLayout _secondLayout;
private Button _firstButton;
private Button _secondButton;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

Context context = getApplicationContext();
_rootLayout = new FrameLayout(context);

_firstLayout = new LinearLayout(context);
_firstButton = new Button(context);
_firstLayout.addView(_firstButton);
_firstLayout.setBackgroundColor(Color.CYAN);
_firstButton.setText("1st button");
_firstButton.setOnClickListener(this);

_secondLayout = new LinearLayout(context);
_secondButton = new Button(context);
_secondLayout.addView(_secondButton);
_secondLayout.setBackgroundColor(Color.GREEN);
_secondButton.setText("2nd button");
_secondButton.setOnClickListener(this);

_rootLayout.addView(_secondLayout);
_rootLayout.addView(_firstLayout);

setContentView(_rootLayout);

}

@Override
public void onClick(View v) {
if(v == _firstButton){
_secondLayout.bringToFront();
}else if(v == _secondButton){
_firstLayout.bringToFront();
}
}
}

Activityに拠らないメリットは切り替えが速い。
LifeCycleとかとかいろいろと面倒なことにならない。たぶん。
デメリット(?)はActivity切り替えのtransitionAnimationが勝手にはつかない。
View次第ではアプリ起動時に全部作るから、時間がかかる(?)メモリを食う(?)のかなぁ?

その1は発想がシンプルだけど、GLSurfaceViewを切り替えるviewに使うと、setContentView()のたびにGLcontextがnullになるらしく、画像読み込みが発生する。と思う。(理解してないだけかも)
その2は重ね順を変えているだけなので、その心配はない。と思う。

PageTop
Androidのデバッグは常に実機でデバッグしてます。
USBをつなぎEclipseから『Debug』ボタンを押下。
そして今までは、USBを切り離してからはアプリが普通に立ち上がっていたのですが、デバッグ機をBNP-500に切り替えてから、何故かUSBを切り離してもWaiting For Debuggerが出て止まってしまう。

で、調べました。

で、今回は結論から言うと、端末(BNP-500)の再起動で直りました。

で、そのことよりも、調べた中で今回とは違う Waiting For Debugger で先に進まないときの解決策があったので、ブックマーク代わりのメモです。

<<参考>>
[Android]"Can't bind to local 8602 for debugger"の対処法 - DQNEO起業日記

ただそれだけです。

PageTop
タイトル通りです。
ちょっとドライバが見つけにくかったのでメモです。
Archos 公式で見つからなかった。なぁ・・

ARCHOS ADB USB Drivers Win Linux Mac Download

この機種CPU(GPU)の割りに画面解像度がでかいのでFPSが出ないですね。
あと、この機種はAppOps(かな?)が有効にされてるらしく、アプリごとにアクセス権を設定できるのはいいですね。
FaceBookアプリ入れてみたら、何度もアクセス権を奪おうとして、その度deniedのToastがでてすごかったです。
Priori2(kitkat)にはこの機能なかったです。
appops.png


BLUEDOT BNP-500 SIMフリースマートフォン
発売当初は想定実売価格19,980円(税込)
この記事の今日現在で公式HPで8,880円(税込)送料込みですね。
元ネタは仏Archos 50b Oxygenといわれてます。

スペック的には
OS : Android 4.4
CPU : MTK6582 (ARM Cortex-A7 1.3GHz クアッドコア)
GPU : Mali-400MP2
RAM : 1GB / ROM : 4GB
microSDカードスロット×1
5.0インチ 1280×720画素(IPS液晶)
バッテリー容量 : 2000mAh
W-CDMA :800 / 2100 MHz GSM :850 / 900 / 1800 / 1900 MHz
SIMカードスロット : 2スロット(W-CDMA用+GSM用)
Bluetooth : バージョン4.0
Wi-Fi : IEEE 802.11 b/g/n
テザリング機能 : 対応(Wi-Fi / Bluetooth / USB)
カメラ : フロント:200万画素 バック:800万画素
GPS : 対応
センサ : 重力センサ / 照度センサ / 近接センサ / 磁気センサ
スピーカー : モノラル

CPU,GPUはPriori2、Goo g01なんかと同じかな。

PageTop
ちょっとした暗号化に
Javaで共通鍵暗号方式「AES」を使用した暗号化と復号化
を参考にstaticなutilメソッドを書いていたのですが、APIをアップデートしたあたりから、
cipher.init(Cipher.ENCRYPT_MODE, key, iv);

Potentially insecure random numbers on Android 4.3 and older. Read https://android-developers.blogspot.com/2013/08/some-securerandom-thoughts.html for more info.
とか言われるようになって、????だったので、
AndroidのCipher.java問題 - maru source
開発メモ: Android4.3 で暗号化処理が変わる・・・?
なこともあって、彷徨っていたら
Androidの暗号化ライブラリConcealを使ってみる - Qiita
という記事を見つけたので使ってみた。

build.gradle とか 何のことやらさっぱりわからんのですが、AndroidStudioとかですかね。
BUCK てのはどうやらFaceBookがオープンソース化したビルドツールらしいです。全く知らない世界です。
てなわけで、
Conceal: Documentation
からjarファイル2個と.soファイルを3個頂いて適宜eclipseに入れてこんなコードを書いてみました。

public static String encrypt(Context context, String name, String plainText) {
String strResult = "";
Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(context), new SystemNativeCryptoLibrary());
if (crypto.isAvailable()) {
try {
// UTF8でbyte[]に変換して、暗号化する
byte[] cipherText = crypto.encrypt(plainText.getBytes("utf-8"), new Entity(name));
// Base64へエンコード
strResult = Base64.encodeToString(cipherText, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
}
}
return strResult;
}
public static String decrypt(Context context, String name, String plainText){
String strResult = "";
Crypto crypto = new Crypto(new SharedPrefsBackedKeyChain(context), new SystemNativeCryptoLibrary());
if (crypto.isAvailable()) {
try {
byte[] byteText = Base64.decode(plainText, Base64.DEFAULT);
// 暗号化されたbyte[]を復号化して、UTF8で文字列に戻す
byte[] decrypted = crypto.decrypt(byteText, new Entity(name));
strResult = new String(decrypted, "utf-8");
} catch (Exception e) {
e.printStackTrace();
}
}
return strResult;
}


単に短い文字列(パスワードみたいなもん。今回の用途は違うけど)を暗号化したかったので文字列を入れたら暗号化された文字列を返して(encrypt)、暗号化された文字列を入れたら元の文字列を返す(decrypt)ようにしました。
nameってのは、わかってませんが必要みたいです。keyみたいなもんですかね。
plainTextが暗号化したい文字列 or 暗号化された文字列 です。

まぁ、これで暗号化した文字列をSharedPreferencesとかでファイルに書き出しておくんで、それを覗かれる程度じゃOKなんですけど、nameをベタ書きしとくと微妙なので
Androidで安全にパスワードを保存する(4) | TechRacho
なんかを参考にいろいろと小細工してみました。まぁ、その辺はConcealとは無関係にやってたことですけど。




concealの前に国産のcamelliaてのを試したのですが、
camellia-android -Android JNI wrapper for Camellia encryption library & AES eccryption library - Google Project Hosting
データの暗号化、camellia-androidを試す - Android Advent
camellia-androidはApache License 2.0のようでいいんですけど、本体のcamelliaのライセンスがどうにもよくわからない(マルチプルライセンスとか仰る)のでやめました。

concealはBSD Licenseとハッキリあるので、安心して組み込めそうです。

PageTop