読者です 読者をやめる 読者になる 読者になる

Preferencesの変わった利用を考えてみる

自メモ)


 Androidだとレジストリにちょっとしたデータを保存するイメージで
Preferencesを使うのでよく実装する関数はこんな感じ。

 これを利用してUUIDを作る感じ。


実際はREAD_PHONE_STATEで端末情報取ったりする方が確実なんだそうなんだけど
IOSと違って権限を表示してしまっている分、詳しい人にきつめに言及されると使えないんですよね〜。

 そういう意味だとBlueToothも同じ訳ですけど*1
IOSはそんなの言及しなくても使えるから、ある意味羨ましい面もあるんですけどね。

 特に既存のアプリとかだと、ちょっと権限増えるだけで
言いがかりっぽい邪推をされてしまう点は凄く困ったところ


 

な感じらしい。IOSは。
AndroidだとMacアドレスから作るOSSの奴もセキュリティ的にダメでしょうと言及はされてたけど
IOSに関してはあんまり言われないのは、儲かってる市場だからかな。。(汗



 で本題としては

Android Security  安全なアプリケーションを作成するために

Android Security  安全なアプリケーションを作成するために

の本で Activity<=>Activity 間のIntentで渡すパラメータが盗聴されてしまうって話
=>
Preferences で遣り取りすれば良くない?
と思ったわけですよ

 で実際試してみたら、こんな感じ

  • 駄目な例
class HogeActivity
   private void Hoge(){
      put_int("test_int",1);
   Intent i = new Intent(getApplicationContext(),FugaActivity.class);
      startActivity(i);
   }

class FugaActivity
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int val = get_int("test_int",-1); //-1が取得される
   }
  • 成功した例
class HogeActivity
   public static Activity instance;
   @Override
   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        instance = this;
   }
   
   private void Hoge(){
      put_int("test_int",1);
   Intent i = new Intent(getApplicationContext(),FugaActivity.class);
      startActivity(i);
   }

class FugaActivity
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        int val = HogeActivity.instance.get_int("test_int",-1); //1が取得される
   }

ようはActivty別なんだな・・・って話。

 確かに Intent ってブラウザ立ち上げたりする機能で
別プロセス立ち上げるイメージになる訳なんですけど
どうしても同じapk内にある場合は、情報とか共有しているんじゃない?
とか思ってしまっていた点がありました・・。完全別物扱いなのか・・。

 別扱いだとsqliteとかDBやファイルで同期取るみたいな考え方も
必要になってくるのかもしれませんね〜




追記)

@kojiokb さんより

なコメントを頂きました。

自分的には

な疑問が出てきたので、あとで調べてみよう・・。


追記2)
取りあえず動いたので

な感じでソースはさらしておく

*1:こちらはこの権限入れるだけで電池を食うな文句が凄い