【Android】オレオレ証明書を無視する

 

 


サーバ側からJSONファイルを受け取って、
解析するってアプリはよくあると思います。

 

 

 

 

そこで、サーバ側が自己証明書を使用している場合
アプリ側も対応が必要になります。


オレオレ証明書

 

 

 

 

 


記載方法は以下になります。

# 今回の条件として、TLS通信であること。
# HttpsURLConnectionを使用して通信を行っていること。


--------------------------------

try {

// オレオレ証明書を使う.
final TrustManager trustAllCerts = new TrustManager{
new X509TrustManager() {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate
chain, String authType)
throws CertificateException {
}

@Override
public void checkServerTrusted(
java.security.cert.X509Certificate
chain, String authType)
throws CertificateException {
}

@Override
public java.security.cert.X509Certificate[]
getAcceptedIssuers() {
return null;
}
}
};

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts,
new java.security.SecureRandom());
SSLSocketFactory sslSocketFactory =
sslContext.getSocketFactory();

connection.setSSLSocketFactory(sslSocketFactory);
connection.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname,
SSLSession session) {
return true;
}
});

} catch (Exception e) {
e.printStackTrace();
}

--------------------------------

 


connect呼ぶ前に対応してあげるといいと思います。

 

 

 

 

 


ちなみに上記記載順番とか入れ替わるだけで
通らなくなるので気を付けてください。


多分、必要な情報が無いとか言って怒られるんだろうな。。

 

【Java】Caused by: java.lang.ArrayIndexOutOfBoundsExceptionが発生

今回は、アプリをタスク上から削除し
Broadcastを飛ばしたら発生しました。

 

 

 

 

原因はBroadcast無いのに

unregisterReceiver(broadcastReceiver);

上記処理が走ったことです。

 

 


Broadcastのnullチェックを追加して対応。

 

 


分からない・・・。
色々な原因があるよね・・・。

日付選択ダイアログの戻るボタン押下イベントが取得できない

 

 


【今回の問題】

日付選択ダイアログを起動するボタンを
連打された場合複数起動されてしまう。

 

 


【対応策】

1度ボタンを押下された場合、ボタンを無効化する

 

 

 

 

 


しかし、ここでさらなる問題。。

 


日付選択ダイアログで戻るボタンを押下された場合、
イベントを取得できない為ボタンが無効状態になったままとなる。

 

 

 

 

 

 

 

 

 

 


以下試したこと・・・

 

 


①onResume()が来ているのではないかと考えた。

 

 

 


結果
⇒来ない。

 

 

 

 

 


②DialogInterface.OnCancelListenerでcancelイベントを受け取る。

 

 

 


結果
⇒実装は完璧な気がする。
 それなのにイベントが来ない。

 

 

 

 

 

 

 

 

 


とりあえず、あきらめることを考えましたが
やはり2重起動は気持ちが悪い為
良い方法があれば教えて頂きたいです。。。

 

FragmentActivityから呼んでるからかな~

 

 

 

 

【Java】Androidの同時押し出来ないようにする方法

Androidの場合、指定をしないとボタンの押下イベントをキャッチし
複数同時に押すことが出来てしまいます。


例えば、①のボタンを押下しながら②のボタンを押下すると
②のボタンの押下イベントが勝ちます。

 

 

 

 

 

 

 

その為、見た目的にも動作的にもあまりよくありません。

 

 

 

 

 

 

 

今回は、上記問題を解決する方法をまとめます。

※すごく簡単。

 

 

 

 

 

 

 

 


該当するresourceファイルのlayoutに以下指定を加えることで出来ます。

 


android:splitMotionEvents="false"

  


以下は例ソース
<test.xml

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:splitMotionEvents="false">

<ImageView
android:id="@+id/test_view1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>

<ImageView
android:id="@+id/test_view2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"/>

</LinearLayout>

 

 

 

 

 

 

 

 

 

複数layoutを指定している場合は、全てに付ける必要があります。

 

 

 

 

ただ、layout指定していないものはまた別に考える必要がありそう。。

 

 

 

 

 

 

 

 

 

 

以上です。

【Android】DatePickerDialogを使って日付を選択する

 

 


カレンダーダイアログから指定の日付を選択。
選択した日付を文字列として表示する。

 

上記のようなケースの場合にDatePickerDialogが役に立つと思います。

 

 

 

 

 

 

 


今回は、指定の期間のみ選択可能とします。

 

 

 

 

 

 

 


まず、Dialogの表示。

 


DatePickerDialog dialog = new DatePickerDialog(getActivity(), R.style.Theme, listener, 2018, 04, 27);

 

 

 

 

第一引数はContext。今回はDialogFragmentを継承したクラスの為、getActivity()です。

第二引数はカレンダーダイアログのテーマ(レイアウト部分)を設定します。

第三引数は設定した結果を表示するActivityを設定します。

第四引数・第五引数・第六引数はカレンダーダイアログを起動させたときにカーソルが当たっている日付をそれぞれ年月日の順に設定します。

 

 

 

 

 

 

 

 

 


次に、指定期間の設定。

 


GregorianCalendar maxDate = new GregorianCalendar();
GregorianCalendar minDate = new GregorianCalendar();


// 上限値を設定.
maxDate.set(2018, 03, 27)

// 下限値を設定.
minDate.set(2018, 05, 27)

 

// DatePickerに設定.
DatePicker datePicker = dialog.getDatePicker();
datePicker.setMaxDate(maxDate);
datePicker.setMinDate(minDate);

 

 

 

 

 

上記を設定することで、
『2018/03/27~2018/05/27』の期間のみ設定可能となります。

 

 

 

 

 

 

 

 

 

最後に、ダイアログのListenerを設定。

 


dialog.setOnShowListener(new DialogInterface.OnShowListener() {
@Override
public void onShow(DialogInterface dialogInterface) {
Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE);
positiveButton.setText("設定する");
Button negativeButton = dialog.getButton(DialogInterface.BUTTON_NEGATIVE);
negativeButton.setText("戻る");
}
});

 

 

 

 

 

 

 

今回は「設定する」ボタンと「戻る」ボタンを
ダイアログに設定しています。

 

 

 

 

 

 

 


設定した日付を取得する側はまた今度。

以上。

データを保存する際に使うPreferenceについて



 

便利なのか便利じゃないのか微妙なところですが、
良く使うPreferenceについてまとめます。

 

 

 

 

 

 

Preferenceとはアプリ内に保存するデータベースのこと。

その為、アプリをアンインストールすると消えてしまいます。

逆に電源落としてもアプリ終了させても消えはしません。

 

 

そういうアプリって世の中に結構あるよね。

ログインしなくても使える電子書籍とか、とか、、

 

 

 

 

 


一見便利そうに聞こえますよね。


しかし、このPreference使い方によってはすごく難しい。

 

 

 

 

 

例えば、Preferenceに保存しました。

 

 


でも、そのままにしていたら。。?

 


アプリをアンインストールするまで
ずーっと残ってるんです。

 

 

 

 

 

その為、設計する際にきちんとPreferenceの初期化処理のタイミングを
考えておく必要があります。

 

 

 

 

 

これをきちんとしておけば便利なAPIだと思います。

 

 

 

 

 

 

 

 

 

前置きはさておき、実際の使い方です。

 

 

 

 

Preferenceは基本putとgetがあります。

 

 

 

 


◆put処理(保存処理)

 

 

 

 ○呼ばれる側

public static void putTestCode(Context context, String testCode) {
SharedPreferences pref = context.getSharedPreferences("", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = pref.edit();
editor.putString("TEST_CODE", testCode);
editor.commit();
}

 

 ○呼出し側

  PreferenceClass.putTestCode(this, "123456789");

 

 

 

 

 

 


◆get処理(取得処理)

 

 

 

 ○呼ばれる側

public static String getTestCode(Context context) {
SharedPreferences pref = context.getSharedPreferences("", Context.MODE_PRIVATE);

    // 第二引数は初期値.
return pref.getString(TEST_CODE, "12345");
}

 

 ○呼出し側

PreferenceClass.getTestCode(context);

 

 

 

 

 

 

 

 


これだけで出来ます。


今回はString型の例ですが、int型やlong型など
様々なデータ型で保存することが可能です。

 

 

 

 

 

 

 


前置きで話したようにデータを全て削除したい場合は、
以下で行うことが出来ます。

 

public static void clearPreference() {
SharedPreferences pref = context.getSharedPreferences("", Context.MODE_PRIVATE);
pref.edit().clear();
}

 

 

 

 

 

 

 


いい感じ!
以上

別Activityから指定のActivityをfinishしたい

今回は別Activityから指定のActivityをfinishする方法をまとめます。

事例としては、startActivityForResultでActivityを起動させた場合
起動されたActivityで処理が完結し、元に戻らないパターンです。

そういった時に、残っているActivityをfinishする必要があります。


説明するために起動側のActivityを①、起動される側のActivityを②とします。


まず、①を自分自身をfinishするメソッドを作成します。

public static void finishActivity() {
 if (sampleActivity != null) {

   // インスタンスがある場合はfinishする.
   sampleActivity.finish();
 }
sampleActivity = null;
}

onCreateでインスタンスを登録しておく必要があります。

 


次に、①をfinishさせたいときは②に以下の実装を追加します。

  SampleActivity.finishActivity();

 

②から指定のメソッドを呼んであげれば良いだけですね。

インスタンスの登録を忘れずに行うことで正常に動作します。


以上