Android関連のことを調べてみた2019年11月12日

Android関連のことを調べてみた2019年11月12日

[Android]Exifを理解して、取得して、表示する

# はじめに

今回は Exif を理解して、取得して、表示して見ようと思います。
最終的には次のような Android アプリを作成して動作確認します。

# Exif を理解する

私は写真の位置情報を取得するなら Exif で理解が止まっているので、
はじめに Exif について調べて理解を深めていこうかなと思います。

## Exif ってなんなのか?
次のようなことが Wikipedia の Exif のページに書いていました。

“`:Wikipediaから引用
Exchangeable image file format(エクスチェンジャブル・イメージ・ファイル・フォーマット)は、
富士フイルムが開発し、当時の日本電子工業振興協会 (JEIDA)で規格化された、写真用のメタデータを含む画像ファイルフォーマッ

元記事を表示

Android visual studi for mac 2019 でnuget でlifecycle extentions

すごいハマったので取り急ぎメモ
現在Androidアプリをvisual studio でC#で実装しているが
iOSアプリで言うところのWillEnterForegroundイベントが取得できない。

https://qiita.com/takusemba/items/92e700ee6c24a3398d03
このページを参考にすると
arch.lifecycle extentions をbuild.gradleで取得するとの記載があるが
visual studio for mac 2019 ではそもそもbuild.gradleが存在しない。
その代わりにデフォでnugetというのが入ってるらしい。

ソリューションエクスプローラからManage nuget Packageを選択し、arch.lifecycle extentions
を探し、1.1.3をインストールしようとしても
失敗しましたと出る。

結局これは
プロジェクト>右クリック>ビルド>全般>ターゲットフレームワークを8.1oreo
にし1.1.1をインストールしたところできた。
Androidのビルドバージョンとlife

元記事を表示

KotlinでBottomNavigationにバッジをつける

BottomNavigationViewでバッジをつけるのにあれこれ調べたので記事書きます。
Material Components Androidのバージョン1.1.0-alpha06からバッジをつけれる機能が追加されたらしいです。

##フッターの準備

Android Studioを使って開発します。
最初にプロジェクトを作成する時にBottom Navigation Activityを選択しましょう。
![スクリーンショット 2019-11-11 15.08.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439548/9040dc92-3f49-8434-c738-173454a7cdbb.png)

これだけでもうフッター付きのアプリが作成されているはずです。
プロジェクトが立ち上がったらアプリを起動してみましょう。

“`kotlin:MainActivity.kt
:

class MainActivity : AppCompatActivity() {

override

元記事を表示

LiveData with Coroutines and Flow (Android Dev Summit ’19)

自分用にgoogleで翻訳

こんにちは、私の名前はJOSE ALCERRECAです。私はAndroidで作業する開発者リレーションエンジニアです。
私の名前はYIGIT BOYARです。Androidチームでも働いています。
そして今日は、LiveDataについて再び話します。
私たちは昨年、LiveDataで楽しいというタイトルの講演を行いました。
今日は、CoroutineおよびFlowとの統合について説明します。
APIはAndroidのライフサイクルを理解するのに苦労したためです。
私たちは皆、ダイアグラムとより多くのダイアグラムを研究しました。その後、フラグメントがやって来て、より多くのダイアグラムを生成しました。
そのため、Android開発者は、この問題に対処する必要から自分自身を隔離しようとします。
プレゼンテーションレイヤーのみがライフサイクルを認識できるレイヤーアーキテクチャを作成し、プレゼンテーションレイヤー内でも、たとえばアクティビティやフラグメントのレクリエーションを生き残るオブジェクトを持つようなパターンやルールを見つけました。
このアイデアは、アーキテク

元記事を表示

LifecycleCoroutineScope を可視化しよう

# はじめに

– [`LifecycleCoroutineScope`](https://developer.android.com/reference/kotlin/androidx/lifecycle/LifecycleCoroutineScope) は `Coroutine`に用意された、非同期処理の範囲を制限するための機能になります。
– その名の通りライフサイクルに依存できるので、各メソッドがどのような範囲で挙動するか可視化してみました。

## 前提条件
– Android Studio 3.5.1 で確認しました。
– AndroidXは `androidx.lifecycle:lifecycle-runtime-ktx:2.2.0-rc01` を利用しています。

## 確認する点
– `LifecycleCoroutineScope` の 以下のメソッドについて確認します。(基本となる `launch`も一緒に確認しています)
– `launchWhenCreated`
– `launchWhenStarted`
– `launchWhen

元記事を表示

Android 4系で drawableLeft にベクターリソースを使用する

TextViewの`drawableLeft`にベクターリソースを使用していたところ、Android4系でクラッシュしてしまいました。
エラーは以下の通り。

“`
Caused by: android.view.InflateException: Binary XML file line #46: Error inflating class TextView
..略
Caused by: android.content.res.Resources$NotFoundException: File res/drawable/ic_info_outline_grey_700_24dp.xml from drawable resource ID #0x7f0700e3
“`

回避方法は`AppCompatTextView`を`TextView`の代わりに使用して、 `app:drawableLeftCompat`でリソースを指定すること。

参考
https://stackoverflow.com/questions/35761636/is-it-possible-to-use-

元記事を表示

アプリのMVPパターンについて

# 経緯
プロジェクトでAndroidとiOSを同時期に開発することになりました。
同じアプリだから挙動や仕様も合わせた方がいいよねという話をして、
Android、iOS両方で実績のあるパターンでかつ、メンバーの学習コストが少ない
アーキテクチャパターンを調査・検討することになりました。

いくつか候補が上がった中で、
MVPがiOSではデフォルトだし、Androidでもよく使われるパターンの一つなので、
まずはこれで行きたいという話になりました。
(AndroidではMVVMがいいかなぁと思いつつ、AndroidでもMVPでできないことはないので、
比較的わかりやすいMVP(PassiveView)で行くことに決まりました)

# 参考書
– [Android アプリ設計パターン入門](https://peaks.cc/books/architecture_patterns)
– [iOSアプリ設計パターン入門](https://peaks.cc/books/iOS_architecture)

この2冊を参考にそれぞれのOSでどう設計するかを検討しました。
ご存知の方も多いかも

元記事を表示

AndroidでServiceと通信する(Kotlinサンプル)

#サンプルコード

ActivityとServiceを1つずつ立ち上げてmessengerでやり取りするサンプルです。
意外とkotlinのサンプルがなかったので、書いてみました。
走り書きですが、よければコピペして使ってください。
※Qiita上でベタベタと切り貼りしたので、貼り付けるだけだと動かないかもしれません。

この中身を解説していきます。

コード全量はこちら。

“`kotlin:MainActivity.kt
package com.satken.randomwikireader

import android.content.ComponentName
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.content.Intent
import android.content.ServiceConnection
import android.widget.Butt

元記事を表示

TextViewに取り消し線をつける

Todoリストを作っていて特定の条件下で取り消し線と色を変えるために調べていたので備忘録

“`kotlin
object AlreadyReadEffect {

fun invoke(textView: TextView, checked: Boolean) {
if (checked) {
textView.apply {
setTextColor(Color.LTGRAY)
paint.flags = this.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
paint.isAntiAlias = true
}
} else {
textView.apply {
setTextColor(Color.BLACK)
paint.flags = Paint.ANTI_ALIAS

元記事を表示

クライアントPCのメモリ(8GB)ではAndroid Emulatorが遅いのでリモートPC(16GB)上のDocker-Androidでデバッグする

#経緯
クライアントPC(Windows10)はメモリ8GBであり、Android Emulatorを起動しつつ開発を行うと重くて話にならない。Android EmulatorはクライアントPC以外で起動したい。

#前提
1. Android Studioがインストール済みであること

#手順
[リモートPC]
1. docker-androidからイメージをpull “`docker pull budtmo/docker-android-x86-7.0“`
2. 起動する `docker run –privileged -d -p 6080:6080 -p 5554:5554 -p 5555:5555 -e DEVICE=”Samsung Galaxy S6″ –name android-container budtmo/docker-android-x86-7.0`

[クライアントPC]
3. adbコマンドをpathに通す
4. adbコマンドでdeviceを接続する `adb connect (リモートPCのIPアドレス):5555`
5. adb device

元記事を表示

New Gradle Sync is not supported due to containing Kotlin modules

IntelliJで掲題のエラーが出た際のメモ

私の場合は下記のように解決

[IntelliJ IDEA] -> [Preferences…] -> [Languages&Frameworks] -> [Kotlin]
ここでプラグインをダウンロードを押下、処理終わり再起動すると下記のような画面になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8350/4fe048dd-913d-4846-ca28-0cf9a17e94b0.png)

上記がKotlinPluginのバージョンであるため、上記のバージョンに `build.gradle` も合わせる必要がある。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8350/b2058394-8102-84a3-7f7c-771be3aadd62.png)

こんな感じ、とりあえずこれで解決

元記事を表示

Navigation Component内部のdeep linkのハンドリング方法

ちょっと仕組みがわからなくてもやもやしていたので、調べました。
間違っていたら教えて下さい

# deep link

以下のドキュメントにDeepLinkの説明があるのですが、Navigationの特定のFragmentなどに遷移できるという説明がありますが、起動方法は書いてあってもIntentなどで起動した後のハンドリング方法は書いていません。ハンドリングせずにどのように遷移するのか謎でした :thinking: :thinking:

Create a deep link for a destination
https://developer.android.com/guide/navigation/navigation-deep-link

explicit deep linkの場合
通知などから起動したい場合に明示的にdistinationを指定して起動できます。

“`kotlin
val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.nav_graph)
.setD

元記事を表示

一部のktxを使うにはJava8対応が必要

DX向上のためにAndroidプロジェクトに[ktx](https://developer.android.com/kotlin/ktx?hl=ja)を導入しようとしたのですが、以下のように**JVM target 1.6にしろ**というエラーに遭遇したので、なぜこのエラーがでるかと言う原因と解決策をちょっと調べてみました。

“`terminal
Cannnot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. Please specify proper ‘jvm -target’ option
“`

## JVM target って何

Androidプロジェクトに含まれる.javaや.kotlinファイルはapk生成時に`javac`や`kotlinc`によって.class拡張子のバイトコードにコンパイルされるのですが、この.classファイルを実行する仮装環境がJVMです※1 ※2。

そして、このJVMのtargetというのはつ

元記事を表示

[Xamarin] GEO Location, Android位置情報をゲット

今日はVisual Studio / Xamarin で Androidアプリを作っています。

# 現在地の取得

アプリの現在地を取得します。

参照にしたドキュメントはこちら
https://docs.microsoft.com/en-us/xamarin/essentials/geolocation?tabs=android

# パーミッションの設定

このアプリはロケーションを取得しますよ、という意思表示をします。いくつか方法はあるようですが、一番簡単なのはこれかな。Android アプリプロジェクトを右クリックして、プロジェクトプロパティからAndroidマニフェスト、必要なアクセス許可の一覧から必要なものをチェック。 ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATIONをチェックします。

> right-click on the Android project and open the project’s properties. Under Android Manifest find the Required permissions:

元記事を表示

dexファイルってなんだっけ

先日開催された[Android Dev Summit’19](https://developer.android.com/dev-summit)の中の[“Shrinking Your App with R8″というYoutube動画](https://www.youtube.com/watch?v=uQ_yK8kRCaA)をきっかけに、Androidアプリのコード圧縮ツールであるR8について調べていたのですが、その中で出てくる**dex**について完全に忘れていたので復習しました。

## 結論

まず結論から言うと、大雑把に表現するならば、**Java(Kotlin)ファイルをAndroid環境で実行可能な形式に変換圧縮したものがdexファイル(classes.dex)**です。

## R8とdex

そもそもR8ってなんだっけ?という点については、[上記の動画を更にサマリーしたスライド](https://speakerdeck.com/nichiyoshi/shrinking-your-app-with-r8-android-dev-summit-19-falsematome)

元記事を表示

ChromebookのAndroidアプリでエンターキーで改行できない件の対策

# はじめに

半年ほど前から、Chromebookの一部機種でAndroidサブシステムがAndroid 9ベースの物に入れ替わり始めました。この上で動作するAndroidアプリでEditTextの動作不良が出るようになりました。具体的には、マルチラインのEditTextでEnterキーを押した時に改行コードが入力されない、という問題です。Shift+Enterは何故か動きます。同じアプリを本物のAndroid+Bluetoothキーボードで動作させた場合は、問題なく動作します。しばらく原因不明で手が出せなかったのですが、ようやく原因が分かりました。

EditTextにEditorActionListenerを設定した場合に、actionId=actionNextでリスナが呼ばれることが分かりました。

“`kotlin
edittext.setOnEditorActionListener { v, actionId, event ->
Log.d(“====>”,”$actionId $event”) // actionId=5が出

元記事を表示

API23未満でTextViewにsetDrawableTintを使う

# はじめに
TextViewにアイコンを入れた際、色を付けるときにdrawableTintを使いたいですが、API23以降なので、minSDKによっては使えません。
その解決法と学びを記します。

# コード

“`kotlin:drawableStart/Endを利用している場合
@BindingAdapter(“drawableTintCompat”)
fun TextView.setDrawableTintCompat(color: Int) {
compoundDrawablesRelative.forEach {
it?.setColorFilter(color, PorterDuff.Mode.SRC_IN)
}
}
“`

“`kotlin:drawableLeft/Rightを利用している場合
@BindingAdapter(“drawableTintCompat”)
fun TextView.setDrawableTintCompat(color: Int) {
compoundDrawables.forEach {

元記事を表示

Mac で Device Monitor を使用するときの注意

ネイティブはもちろん、 Unity で AR の開発とか、実機で確認中にログをモニタリングしたいときに役立つ `Device Monitor` ですが、いざ使うとなると大変だったのでメモ書き

# まずアプリケーションの場所

`/Library/Android/sdk/tools/lib/monitor-x86_64/monitor.app`

深すぎい!

# Java 入れる

8系を入れる。しかも最新だとダメ。動くけどクリックが反応しなかったり。
なので
https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html?ssSourceSiteId=otnjp

ここから適当に古いやつを。。。(私は `8u111` での動作を確認しています。)

# まとめ

マイナーバージョンで動かなかった時は自分にアプリケーションを操作する才能がないと勘違いした。

元記事を表示

Android10で画像/動画キャプチャアクションの結果をパブリックディレクトリに保存する

私の開発している Android アプリにおいて、 [MediaStore.ACTION_IMAGE_CAPTURE]() や [MediaStore.ACTION_VIDEO_CAPTURE]() アクションを指定したインテントにより画像や動画を撮影し、パブリックなディレクトリに保存しつつアプリの機能で利用するということをやっていました。

しかしながら [Android10のプライバシー保護のための変更](https://developer.android.com/about/versions/10/privacy?hl=JA) により、利用していた API がことごとく Deprecated になってしまいました。この対応をした時のメモを残します。

## Android 9 まで

### 保存先Uriの決定

[Environment.getExternalStoragePublicDirectory](https://developer.android.com/reference/android/os/Environment#getExternalStoragePublic

元記事を表示

[ Android ] [ localization ] 言語切替4

今回も言語切替について記す。

前回記事でほとんど綴っているので、ポイントのプログラムのみ解説する。
https://qiita.com/QiitaD/items/e26287727e067cd98a1f

##initialize()
以下のようなプログラムを前回のプログラムに加えることで、表示切替ができる。
(変数名は変えているので注意していただきたい)

~~~java
button.setOnClickListener((View view1)->{
Context context2 = MyContextWrapper.wrap(newBase2, newLocale);
//付け加え
if (isLocaleJp(context2)){
newLocale = Locale.ENGLISH;
textView2.setText(“こんに”);
button.setText(“英語表示”);

元記事を表示

OTHERカテゴリの最新記事