- 1. WebViewで基本認証させる際の注意点
- 2. 記事というよりただのメモ?
- 3. 【kotlin】超簡単なMVPを実装してみた、①Presenterの実装
- 4. gradleのバージョンを上げないで”Could not determine java version from”を回避する方法
- 5. キーボードの表示、非表示を切り替える方法
- 6. モバイルシステム技術検定(MCPC)2級の対策
- 7. Android開発におけるドキュメント作成”Dokka / KDoc”の導入手順
- 8. Gradle 6.7.1以下 -> 6.8以上 にアップデートするとbuild.gradleのdependenciesのexcludeの挙動が変わる
- 9. 集中力を維持するためのポモドーロタイマー
- 10. Guide to app architectureからプラクティスを拾うメモ UIレイヤー編
- 11. EditTextのカーソルの行の位置を取得するには
- 12. flutter_native_splash使ってみた
- 13. アクティビティライフサイクルの大まかな流れを把握する
- 14. Expo (React Native) でViewを画像に変換してデバイスに保存する
- 15. VibratorManager を利用する
- 16. AndroiderのiOS奮闘記~UIKitとは~
- 17. [Android]かんたん強制バージョンアップ
- 18. カレンダーをいい感じに実装する方法
- 19. MaterialButtonでテキストカラーが変更されない時の対処法
- 20. Android API 31以降の自機IPの取得
WebViewで基本認証させる際の注意点
—
## 最初に結論AndroidアプリのWebViewで基本認証させようと思って検索するとよく見かけるサンプルコードについて、これではコンテンツに埋め込まれている外部サイトのオブジェクト(画像とかロギングツールとか広告オブジェクトとか)へ認証情報を流してしまうかもしれないので、注意が必要。
つまり、**認証情報を提示するホスト/URLを、きちんと制限しましょう。**という至極当然の結論。—
## よく見るサンプルコード“`java
webView.setWebViewClient(new WebViewClient(){
@Override
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm) {
handler.proceed(“ユーザ名”, “パスワード”);
}
});
“`つまり、WebViewClientクラスの「onReceivedHttpAuthRequest」をオーバーライドして
記事というよりただのメモ?
Androidアプリで複数フラグメントで共有のViewModelを持つ方法について
その前にViewModelの概念についてよくわからないまま使用していたので、いろいろ調べたら以下の単語が出てきた
・activityViewModels
そのアクティビティで定義されてるViewModel?
・viewModels
こいつはなんだ???どうやって使うんだ?
・navGraphViewModels
こいつはnav_graph.xmlで同じnavigation内に定義されているfragmentの時に使えるらしい。testFragmentで以下のような実装をしてみた。
private val sharedViewModel: SharedViewModel by activityViewModels()
private val test2ViewModel: Test2ViewModel by activityViewModels()
SharedViewModelはMainActivityで定義されている
Test2ViewModelは別のfragmentで生成されたViewMode
【kotlin】超簡単なMVPを実装してみた、①Presenterの実装
# MVPとは?
Androidアーキテクチャの一つ。
ActivityやFragmentで行っていた処理を以下の三つの役割に分ける。・Model(データに関する処理を行う)
・View(画面に関する処理、クリック等のイベントを拾ってPresenterに送る処理を行う)
・Presenter(Viewからイベントを受け取り、Modelを操作したり、Viewに伝え画面操作を行うロジカルな処理を行う)**[メリット]**
・Activity,Fragmentの肥大化を防げる。
・テストがしやすい。# 実装内容
Presenterまで実装する。
EditTextに文字を入力してボタンを押したら、下部のTextViewに表示させる(超簡単)。
![presenter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/784089/327d668f-79fd-381d-ac6a-bec60fe05c83.png)# 実装
**[レイアウト]**
①editText
②button
③textView
gradleのバージョンを上げないで”Could not determine java version from”を回避する方法
このエラーが出た場合はgradleのバージョンを上げてやれば良いのですが
なんらかの理由でgradleのバージョンを上げられない場合の回避策です。この方法はandroidで署名なしreleaseビルドを作成する際に使いました。
## 古いjavaをダウンロードする
“`
curl -O https://corretto.aws/downloads/resources/8.312.07.1/java-1.8.0-amazon-corretto-jdk_8.312.07-1_amd64.debsudo apt install ./java-1.8.0-amazon-corretto-jdk_8.312.07-1_amd64.deb
“`## 古いjavaを指定してビルドする
“`
JAVA_HOME=~/.jdks/corretto-1.8.0_312 ./gradlew assemble
“`
キーボードの表示、非表示を切り替える方法
#はじめに
キーボードの表示、非表示に関しては、ほぼ全てのアプリで実装が必要になると言っても過言ではない要件ですよね。
いつも調べて思い出すことが多いので、簡単にまとめておこうと思います。#キーボードの表示
表示する際の実装は以下“`ViewExtensions.kt
fun View.showKeyboard(
flag: Int = 0
) {
(context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager)
.showSoftInput(this, flag)
}
“`#キーボードの非表示
非表示にする際の実装は以下“`ViewExtensions.kt
fun View.showKeyboard(
flag: Int = 0
) {
clearFocus()
context.getSystemService()?.hideSoftInputFromWindow(windo
モバイルシステム技術検定(MCPC)2級の対策
皆様
お久しぶりです。satolabです。
最終更新から1年以上の月日が流れました。現在私は某IT企業でモバイル系のインフラエンジニアをしております。この1年は慌ただしく、qiitaをはじめ情報発信や趣味の開発に中々時間を割けておりませんでした。
現在も四苦八苦の日々ですが、少しずつ情報発信の方も再開出来ればと思っております。
前置きが長くなりましたが、今回はちょっとニッチな資格である”MCPC2級”の対策について紹介したいと思います。
私は11月に受験し、無事合格出来ました。
##概要
モバイルシステム技術検定(通称:MCPC)は、モバイルシステムの提案、構築、運用のために必要となる知識とそのレベルを明示することによって、IT関連技術者の学習意欲の喚起を行い、その学習成果を検定(試験)により測定することが可能となります。
(引用: https://www.mcpc-jp.org/kentei/gaiyou.html)
試験は年に二回あり、後半の回はCBT方式で受けることができます。私は最寄りのテストセンターで受験しました。
なおボーダーは公開されていません。##対
Android開発におけるドキュメント作成”Dokka / KDoc”の導入手順
# Dokkaとは
“KDoc”形式で記載したコメントを、Javadocと同様な形でドキュメントを作成できる。
JavaとKotlinが混在したプロジェクトのドキュメントも生成可能https://github.com/Kotlin/dokka
# 導入
“` project/build.gradle
buildscript {
ext {
dokka_version = “1.6.10”
}
dependencies {
classpath “org.jetbrains.dokka:dokka-gradle-plugin:${dokka_version}”
}
“`“` app/build.gradle
apply plugin: “org.jetbrains.dokka”android {}
dependencies {}// dokkaHtml 用の設定
dokkaHtml.configure {
outputDirectory.set(new File(“${buildDir}/dokkaHtml”))
Gradle 6.7.1以下 -> 6.8以上 にアップデートするとbuild.gradleのdependenciesのexcludeの挙動が変わる
# 概要
androidアプリを作成中、gradleをアップデートしたら、それまで問題なく使えていたアプリソース中のkotlinファイルでの`import kotlinx.coroutines.CoroutineDispatcher`に対して`Unresolved reference: CoroutineDispatcher`とエラーメッセージがつくようになってビルドができなくなった。
アプリケーションモジュールのbuild.gradleのdependenciesに`implementation “org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:$kotlin_coroutine_ver”`を追加してやったところビルドが通るようになった。## 理由
アプリで使っているcoroutineライブラリとpagingライブラリに入っているそれとがバージョンが違っていたのでpagingライブラリのほうから抜くためにアプリケーションモジュールのbuild.gradleのdependenciesで以下のようにしていたのだが、gradle 6.
集中力を維持するためのポモドーロタイマー
学内の学生主体で進めるプロジェクトで「ユーザの集中力を持続させるシステム」を構築する機会がありました。
その際にポモドーロタイマーを用いて休憩時間を管理してくれるアプリを作成致しましたので、その内容について少しだけ触れさせて頂きます。
まず今回使用したのはReact Nativeです。iosとandroidの双方に対応できるクロスプラットフォームフレームワークを使用したいという理由から使用しました。
![Screenshot_20220110-015520_project1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2488482/7170aeca-6619-6bd5-c219-5c5e1918db46.jpeg)
上の画像が実際のアプリ画面です。
左上にタスクに取り組む時間を、右上に休憩時間を打ち込み、開始ボタンを押します。指定した時間が過ぎると端末が振動し、テキストが変化します。
![Screenshot_20220110-015956_project1.jpg](https://
Guide to app architectureからプラクティスを拾うメモ UIレイヤー編
https://developer.android.com/jetpack/guide?hl=en
上記から拾ってメモしておきます :pencil:
ちょっと分かりにくい部分として、最初に書いておきたいのが、UIレイヤーとUIは別で、UIレイヤーにはState holder(ViewModelなど)も含み、UIやUI elementはActivityなどを指すようです。
https://developer.android.com/jetpack/guide/ui-layer?hl=en より
(あとでまとめ記事的なのを作るかも?)
## Activityなどのアプリのコンポーネントにアプリのデータや状態を持ってはいけない
> Given the conditions of this environment, i
EditTextのカーソルの行の位置を取得するには
EditTextのカーソル位置を取得するのは、調べたりするとすぐ出てきたりしますが、カーソルが何行目なのかを取得する方法が、無かったので忘れないようにする為、書いておく事にします。
# EditTextのカーソルの行の位置を取得する方法
“`
val layout: Layout = binding.editText.layout
val offset: Int = binding.editText.selectionEnd // カーソルの位置
val line = layout.getLineForOffset(offset) //引数に指定したoffsetの行番号(カーソルが何行目か)
val primaryHorizontal = layout.getPrimaryHorizontal(offset) // 引数に指定したoffsetの水平位置が返ってきます(カーソルが左端からの水平位置)
“`EditTextのLayoutを使う事で、取得することができました。
# カーソルを上に移動させる方法
“`
binding.editText.setSele
flutter_native_splash使ってみた
## 要約
– Splashとは?
– flutter_native_splashを使ってみる
– Android実装時の注意点
– OS 12の注意点
– Flutter2.5以上ではAndroidManifestの`meta date`を消す
– 感想
– 参考記事## Splashとは?
アプリを立ち上げるときに一瞬表示される画面のことです。
## flutter_native_splashを使ってみる
`pubspec.yaml`にライブラリと`flutter_native_splash`の設定を追加する“`pubspec.yaml
dependencies:
flutter_native_splash: ^1.3.3flutter_native_splash:
color:
アクティビティライフサイクルの大まかな流れを把握する
# この記事は
**[Android 公式 Doc のアクティビティライフサイクル](https://developer.android.com/guide/components/activities/activity-lifecycle#alc)** に、図など視覚情報を補足したもの。
**内容はあくまで参考にとどめてください**
—
以下のサンプルアプリ(仮称: `Lifecycle` アプリ) を使う。
* `Lifecycle` アプリには `MainActivity`, `SettingActivity` が存在する
* `Lifecycle` アプリ初回起動時は `MainActivity` が起動する
* `SettingActivity` は
* `MainActivity` から `startActivity` で起動する
* `finish()` で終了する| MainActivity | SettingActivity |
| :–: | :–: |
| ![main_activity.png](https://qiita
Expo (React Native) でViewを画像に変換してデバイスに保存する
# はじめに
React Nativeで新作アプリを作りました。
久しぶりにカスみたいなアプリ作りました
姓名判断っぽい画像を捏造できます
12/30に完成したんですが、Appleさんに怪しい占いアプリと勘違いされ、なかなか出せませんでした#嘘姓名判断Androidhttps://t.co/IyslOklSkl pic.t
VibratorManager を利用する
# Context.VIBRATOR が Deprecated に
API Level 31 (Android 12) より `getSystemService(Context.VIBRATOR)` が **Deprecated** になりました。
以降は同じく API Level 31 で追加された `getSystemService(Context.VIBRATOR_MANAGER_SERVICE)` の使用が推奨されます。# Vibrator Manager の使い方
`AndroidManifest.xml` に次のパーミッションを追加します。
“`xml:AndroidManifest.xml
“`つづいて `MainActivity.kt` に処理を記述します。
サンプルではこまかな点まで考慮しておりませんのでご了承ください。“`kotlin:MainActivity.kt
class MainActivity : AppCompa
AndroiderのiOS奮闘記~UIKitとは~
#この記事は
iOSのキャッチアップを余儀なくされた生粋のAndroiderの奮闘日記です。
単発の記事になりますが、ご容赦ください。#UIKitとは
ドキュメント読んでいきます。
>Construct and manage a graphical, event-driven user interface for your iOS or tvOS app.iOSとtvOS用に作られたもので、イベント駆動なインターフェースを提供してくれるフレームワークのようです。
iOSシステムとのインタラクティブを管理してくれるようです。全然知らなかったけど、Apple社はテレビ用のOSも出してるんや。
注意書きとして、UIKitのクラスはメインスレッドのみで使用するのがルールみたいです。
#SwiftUIとの違いは
SwiftUIもiOSでUIを描画するためのフレームワークですが、新しいものみたいです。
ただ、一つのプロジェクトに両者をブリッジできるようなので、組み合わせて使える。AndroidでもJetpackComposeを既存のものに組み込めるので、それと同じかなと。
#
[Android]かんたん強制バージョンアップ
#Sirenとは
簡単に強制バージョンアップが実装できるライブラリです。
Android,iOS共に存在しますが、今回はAndroidで試します。#設定
まずは、root直下のgradleファイルにて、jitpackリポジトリから取ってこれるようにします。“`groovy
allprojects {
repositories {
maven { url “https://jitpack.io” }
}
}
“`そして、appモジュールのgradleファイルに依存関係を追加。
“`groovy
dependencies {
implementation ‘com.github.eggheadgames:Siren:1.5.2’
}
“`Sirenは、jsonを購読して強制バージョンアップする必要があるか否かを判断します。
“`json
{ “hoge.fuga.app”:
{
“minVersionName”: “1.5.0”,
“minVersionCode”: “
カレンダーをいい感じに実装する方法
#はじめに
Androidの標準カレンダー、非常に使いづらい上に、拡張性なくて辛いと感じたことはありませんか?
最近になっていい感じに実装可能なカレンダーのライブラリを発見したので、紹介したいと思います。#CalendarView
今回ご紹介させていただくのは、以下ライブラリです。
https://github.com/kizitonwose/CalendarViewこのライブラリは3年ほど前に作成されたライブラリのようですが、拡張性が高く、内部もKotlinで実装されており、Kotlinとの親和性が高い点信用ができます。
上記githubにサンプルがあるので詳細に関しましてはそちらをみていただければと思いますが、簡単に実装方法をまとめたいと思います。
#1. ライブラリの追加
まずはじめにappレベルのbuild.gradleに以下を追加する必要があります。
“`
dependencies {
implementation ‘com.github.kizitonwose:CalendarView:‘
}
“`#2. レイアウト
MaterialButtonでテキストカラーが変更されない時の対処法
#初めに
最近のアプリでは、マテリアルデザインを基に作っているアプリが多いかと思いますが、そこで自分がつまづいたことをメモしておこうと思います。##つまづいたこと
MaterialButtonに対してのテキストや、スタイルの設定は直接書き込むことができるが、あまり好ましくないので、皆さんは`styles.xml`や`textAppearance.xml`にまとめておいてあるかと思います。
そこで、今回つまづいたことはMaterialButtonのテキストに対して設定が反映されていないということでした。###解決方法
解決策自体は、すごく単純なものでした。
普通、テキストに対しての設定なので`textAppearance.xml`に対して全ての設定を書いてしまうかと思いますが、テキストの色自体はMaterialButtonの管轄内なので`styles.xml`に対して記述をしないと意味がありません。
逆に、テキストの色以外はMaterialButtonが把握していなくてもいい内容なため、MaterialButtonの管轄外になります。
したがって、テキストカラーへの設定は`sty
Android API 31以降の自機IPの取得
API31からWifiManager経由の自分のAndroidのIPアドレス取得が非推奨になりました。そのままのコードでもとりあえず動作するようですけど、修正するとしたら次のようにConnectivityManagerを使うようにする必要があります。
# API 31以前のWifiManagerによるIPアドレスの取得
“`kotlin
val manager: WifiManager =this.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
val ip = manager.connectionInfo.ipAddress
Log.i(TAG,arrayOf(ip,ip shr 8,ip shr 16,ip shr 24).map{it and 0xff}.joinToString(“.”))
“`IPはIntで取得されるので、1バイトずつ分割して表示しています。例えば192.168.1.1のように表示されます。
# API 31 以降の場合
build.gradle(ap