【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();
②から指定のメソッドを呼んであげれば良いだけですね。
インスタンスの登録を忘れずに行うことで正常に動作します。
以上