Android関連のことを調べてみた2021年05月28日

Android関連のことを調べてみた2021年05月28日

NDK at ~/Android/Sdk/ndk-bundle did not have asource.properties file と出た時

# 起こったこと
Androidアプリをビルドしようとしたところ、
“` NDK at ~/Android/Sdk/ndk-bundle dit not have a source.properties file “`

と表示された。

# 解決策
“` ~/Android/Sdk “`にてndk-bundleディレクトリを削除するとエラーが解消した。

元記事を表示

【Android / Kotlin】USB Debuggingモードでアプリ起動を拒否する

セキュリティのため、USB Debuggingモードの場合に起動を拒否する必要があり実装しました。
最初に起動するActivity内に記載します。

![Screen Shot 2021-05-28 at 9.44.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429030/1902a36e-c9f9-3bba-477b-3bbd2f39d3f1.png)

“`kotlin
@AndroidEntryPoint
class SomeActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

if (isDebuggingMode()) {
restrictOperation()
}
}
private

元記事を表示

パーミッション管理の「もう一つ」のライブラリ Dexter

Androidのランタイムパーミッション周りの処理で使うライブラリといえばPermissionsDispatcherですが、Dexterも使いやすくて便利なので簡単な利用例を交えて紹介します。

###説明
https://github.com/Karumi/Dexter

以下公式説明から引用
> Dexterは、実行時に権限を要求するプロセスを簡素化するAndroidライブラリです。
> アクセス許可コードをアクティビティから解放し、そのロジックを好きな場所に記述できるようにします。

###例
Dexterオブジェクトを作成し、取得したい権限とランタイムパーミッションでのユーザー操作後の処理を定義します。
下記は画面上のボタンを押した時に位置情報権限(ACCESS_FINE_LOCATION, ACCESS_COURSE_LOCATION)を取得する処理を行うことを想定した例です

“`kotlin:
Dexter.withContext(context)
.withPermissions(
Manifest.permission.ACCESS_FINE

元記事を表示

【AdMob】OpenBidding導入後の効果

#はじめに
2021年4月からAdMobのOpenBidding機能が一般開発者にも開放されました。
私のアプリにも導入して一定期間経ったのでその効果などを記します。

先に書いておくと、多少は効果がありましたが大きく収入が伸びたわけではありません。
まだ導入して2ヶ月程度なのでこの先伸びる可能性はありますが…

#OpenBiddingとは
一般的に広告枠には特定の広告配信会社の広告を表示します。
ところがOpenBiddingは複数の広告配信会社に一斉にリクエストを飛ばし、一番高い単価を提示した会社の広告を表示するというものです。
しかもリクエストを飛ばすのはAdMob(Google)側のサーバが担うため、スマホ側への負荷は無くいい事だらけの技術です。
リアルタイムオークションと言ったほうが伝わりやすいかもしれません。
日本語では「公開入札」と呼んだりします。

なお、各広告配信会社とは個別に契約する必要があります。(契約といってもユーザ登録+αレベル)

また、一部の広告配信会社はアプリにSDKを組み込む必要があります。
SDKが出てくると難しく感じるかもしれませんが、想像して

元記事を表示

[Android]Handlerの非推奨の解決策&ちょっと理論的な事も

#非推奨になっちゃうやーつ

“`kotlin:
const val DELAY_TIME = 1000

fun delayDelay() {
Handler().postDelayed({
// 遅延させたい処理
}, DELAY_TIME)
}
“`
正しくは

“`kotlin
Handler((Looper.getMainLooper())
“`
Handlerの引数を指定してあげてください。
#なんで?
ついでに、Handlerについて理論的な事を少しだけ喋ります。

登場人物が多いですが、こう例えてください。
Handler =「トラック」
Message Runnable =「荷物」
Looper =「工場」
Queue =「先入れ先出し」
Message Queue =「ベルトコンベアー」

Androidのメインスレッド(UIスレッドと同じ)には、工場(Looper)が元々あります。
そして、工場内にはMessage Queueという「ベルトコンベアー」があります。
ベルトコンベアーは、Queue

元記事を表示

NoCodeで習慣化しなくていい日記アプリをつくりました

![noteサムネ_flour告知.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127251/a47cd97b-a7e4-da9f-aeff-90a48a39123a.png)

こんにちは。フローリシング代表の中沢草太です。

普段メンタルヘルスのアプリを作っていて新しいアプリを公開したので紹介します。
このアプリはNoCodeのKodularを用いて開発しています。

#何を作ったのか?

習慣化しなくていい日記アプリ「[flour](https://play.google.com/store/apps/details?id=jp.flourishing.flour&hl=jp)」を作りました。
(日本語と英語に対応しています)

https://play.google.com/store/apps/details?id=jp.flourishing.flour&hl=jp

なんで習慣化しなくていいのかというと**Twitterをしながら日記を書くことができるから**です。

Twitterし

元記事を表示

Google Maps ActivityをFragmentへコピペするときの注意

少しハマったのでメモ

# やろうとしたこと
– Google Maps Activity のコードをそのまま新規FragmentにコピペしてMap表示するFragmentとして使う

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344513/e91a2588-bfb6-8ef5-631d-49ba68a3ed46.png)

# ハマったこと
– “Unresolved reference: supportFragmentManager” というエラーが出る

# 対策
– supportFragmentManager から childFragmentManager に変更

対策前

“`kotlin:Fragment.kt
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

元記事を表示

RecyclerViewで広告用のレイアウトを設定する

#目的
RecyclerView内に広告(バナー広告を想定)を掲載する際、広告用のレイアウトを設定する方法がLayoutManagerによって異なったため、それぞれのLayoutManagerでの設定方法のメモ

#前提
RecyclerView.AdapterのgetItemCountは広告の枠も含めた件数を返し、getItemViewTypeで該当する位置が通常のアイテムか広告か判断出来るようになっているものとします。

#LinearLayoutManager
AdapterのonCreateViewHolderとonBindViewHolderでViewTypeごとの処理に振り分けるだけ。

“`java
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == ITEM_TYPE_ADS) {
// 広告用のViewHolderを返す
} else {
// 通常のViewH

元記事を表示

【Kotlin 初心者】CustomDialogの作り方

ダイアログをオリジナルのデザインで使いたい時に必要になるのがこのCustomDialogになります。

### デフォルトのDialogのイメージ

| デフォルトのDialog | オリジナルのDialog |
|——–| ——|
| | |

### 作り方
“`MainActivity.kt
package com.example.myapplication

import android.os.Bundle
import android.w

元記事を表示

ストップウォッチ

activity_main.xml

“`

元記事を表示

既存のレイアウトの一部にJetpack Composeを組み込む

#はじめに
Google I/O 2021でアナウンスされたように、今後Jetpack ComposeでUIを組み込んでいくのが推奨されていくようです。
そこで、本記事では既存のアプリにJetpack Composeを組み込む方法を説明します。

#既存のアプリにJetpack Composeを組み込む
###レイアウト
レイアウトファイルの一部でComposeを使う時の例です。

“`xml

元記事を表示

【Android / Kotlin】ズーム対応のPDF表示サンプルアプリ(PdfRenderer + PhotoView)

# はじめに
今回 Android でPDFを表示するためにはどのように実装する必要があるかを調査、検討しました。

結論、Android でPDF表示をするのはかなり大変。
というかただ表示するだけであればそこまで難しくはないものの、使い勝手をよくするためにいろいろな機能を実装したりするとなると相当大変そうです。(というかそもそも可能か?ということもあります。)

iOS のようには行かないみたいです。
Android 大変や…

こんな意見もあって、参考にさせていただきました。
https://qiita.com/s_of_p/items/1c1a467d246ab7dc45e1

そこで今回は

– PDFを1枚だけ表示(標準SDKの[PdfRenderer](https://developer.android.com/reference/kotlin/android/graphics/pdf/PdfRenderer)を利用)
– ズームイン / ズームアウトに対応(ライブラリ[PhotoView](https://github.com/Baseflow/PhotoView)を利

元記事を表示

Androidでマイクラサーバを動かす

#きっかけ
最近マイクラ鯖をDockerコンテナ上とかラズパイ上に立てて遊んでいて、ふとスマホでも Javaが動けばいけるのでは、と思った

#大まかな流れ
1. Termuxアプリ上にUbuntuをインストール
2. Javaをインストール
3. マイクラのサーバプログラムを動かす

#検証環境
* 端末 : [Xiaomi Redmi 9T](https://www.mi.com/jp/redmi-9t)
* [Termux](https://play.google.com/store/apps/details?id=com.termux&hl=ja)バージョン : 0.101

#Ubuntuのインストール
[こちらの記事を参考にしました](https://qiita.com/v2okimochi/items/89eb26a8c69105914604)

###必要になるツールのインストール

“`bash
apt update
apt install -y wget proot git
“`

###`ubuntu-in-termux`をcloneしてくる

“`bash

元記事を表示

ThreeTenABPのLocalDateTimeからミリ秒を除外する

“`build.gradle
dependencies {

def threeTenAbpVersion = ‘1.3.0’
implementation “com.jakewharton.threetenabp:threetenabp:$threeTenAbpVersion”
}
“`

“`MainActivity.kt
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.jakewharton.threetenabp.AndroidThreeTen
import org.threeten.bp.LocalDateTime
import org.threeten.bp.OffsetDateTime
import org.threeten.bp.format.DateTimeFormatter
import org.threeten.bp.temporal.ChronoU

元記事を表示

[Android]思考停止で使っていたsetOnClickListener{}を少し掘り下げる

#ボタンをポチポチ
どうもReoです。
Buttonをタップした時に、何かの処理をした時に、取り敢えず

“`kotlin
buttonView.setOnClickListener {
// 何かしらの処理を書く
}
“`
こんな感じで当たり前のように使っていました。
しかし、最近これの拡張関数を作る時にググって参考にしたメソッドがあるのですが、それが理解できない。
何故なら、リスナーがどう成り立っているのか分からなかったから。

さて、こいつを脳死で使っていたことが判明したので、掘り下げたいと思います。

#裏のコード旅へ!
適当にButtonViewを追加して、MainActivityとかからViewを呼び出して、setOnClickListenerを実装してください。
裏のコード見るには、リスナーメソッドにカーソルを合わせてWindowsの方はCtrl + Enter。
Macの方は、Command + Enterです。

こんなコードに飛んだかと思います。

“`kotlin:View.java
public void setOnClickListener

元記事を表示

iPadやAndroidでhostsを書き換えたい時の手軽な代替方法

## はじめに
実際に iPadやAndroidのhostsを直接書き換える方法、ではありません。
この質問が出る時に使える代替方法の話です。

##ドメイン名の名前解決とは?
例えば、ブラウザに https://yahoo.co.jp と入れてエンターを押すと、Yahooのホームページが表示されます。
それは、
1)yahoo.co.jp というドメイン名が登録されている
2)世界中から、”yahoo.co.jp” を調べて、IPアドレスに変換(DNSによる名前解決)
3)ブラウザは、そのIPアドレスにアクセスしてページの情報をもらって表示する
という一連の作業が連携して行われているからです。

参考例:
![powershell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114744/43032efd-2f85-fa5d-3ba0-6787ed2133b2.png)

実際の開発の現場では、「まだ世界に公開されていないドメイン名だが、今だけ、自分のマシンの中でだけ名前解決させたい」というニーズが

元記事を表示

【C#・Android】画面上のタッチ位置の座標取得

C#でandroid用のコードを書く時のメモです。
javaで書く時とほぼ同じですが、微妙に違います。

##コード
違う点は、javaだと`override`の書き方が違う点と、`OnTouchEvent()`の先頭が小文字である点です。

“`c#
public class MainActivity : AppCompatActivity {
protected override void OnCreate(Bundle savedInstanceState)
{
// 省略
}

///

画面タッチ時の処理

public override bool OnTouchEvent(MotionEvent e)
{
System.Diagnostics.Debug.WriteLine(“X座標->” + e.GetX() + “,Y座標->” + e.GetY());
return

元記事を表示

(Beta1.0時点での)Android 12におけるBluetooth Permission

# はじめに
Android 12でBluetooth接続を行う際のPermissionが少し変わったようです。
Beta1.0がリリースされたので、自アプリがクライアントとして他のBLEデバイスに接続する場合のPermissionにどのような違いがあるのかを触ってみました。
シミュレータの動作ベースで確認した内容でまとめますが、探り探りのため記載に関して誤りやご指摘を頂けると助かります。:sob:

# 基本的なAPIのtargetSdkVersionによるPermission要求の違い
| API | targetSdkVersion 30 | targetSdkVersion 31 |
| – | – | – |
| BluetoothAdapter.isEnabled() | BLUETOOTH | BLUETOOTH, BLUETOOTH_CONNECT |
| BluetoothLeScanner.startScan() | BLUETOOTH_ADMIN, ACCESS_FINE_LOCATION | BLUETOOTH_ADMIN, BLUETOOTH_CONNECT,

元記事を表示

【Flutter】入れ子のリストでbuilderを効かせる

この記事で解決する問題

入れ子のリスト(リストの中にあるリスト)を使う際に、builderがうまく機能しない。

builderだと画面に見える部分のみ生成されるが、なぜか最初にすべて生成され、読み込みに時間がかかる。

なぜ機能しないのか

親がスクロール系のウィジェットのとき、子のリストが独立してスクロールできないようにNeverScrollableScrollPhysicsを使用できる。

だが、これを使用しているとbuilderがスクロールしていない判定になり、buiderの特徴であるダイナミックなローディングが効かないため、一気に読み込むことになってしまう。

解決策と使用例

●CustomScrollViewを使用する

![20210523_120424[1].gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1188685/9bfc85e3-50f7-850d-4a9a-f40f7d5de318.gif)

CustomS

元記事を表示

GoogleMapsPlatformを使用したルート案内

# はじめに
GoogleMapsPlatformを使用してルート案内方法を覚書程度に記載。

説明するアプリの概要はMap上に現在地を表示し、クリックした場所にマーカーを設置。
設置したマーカーをクリックすると目的地として設定され、現在地から目的地までのルートが描写される。

# 目次
1. マップ画面を生成
2. 現在地を取得
3. 目的地を取得
4. ルート取得API(Directions API)へアクセスするURLを用意
5. 現在地から目的地までのルートを取得
6. 取得したデータをもとにルートを描写

事前準備として、GoogleMapsPlatformのAPI使用を使用できるようにする必要がある。
詳細手順は下記参照。
https://developers.google.com/maps/documentation/android-sdk/overview?hl=ja

## 内容
### マップ画面を生成
activity画面にid=mapのフラグメントを用意し、onCreate時にsetContentViewする。

“`activity_map.xml

元記事を表示

OTHERカテゴリの最新記事