20220116のAndroidに関する記事は6件です。

【Unity】Android実機のログを確認する方法

Unityで開発をしていて、Androidの実機を動かしている時のログを確認したい時があると思います。 今回はそのログを簡単に確認する方法についてです。 環境 Windows10 Unity Hub 2.4.5 Unity 2020.3.25f1 Android Studio 2020.3.1 Android Logcatをインストール Unity2019からPackage Managerに公式のツールが加わっています。 Windows > Package Manager へ移動して、 左上のPackagesを「Unity Registry」にします。 すると「Android Logcat」という項目があるので、 それをインストールするだけです。 あとはPCと実機を繋いで「Build And Run」をするとAndroid Logcatが起動して以下のようにログが出力されます。 ログの出力を止めたい時は、「Disconnect」をクリックするだけです。 以上、ご拝読有難うございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ADBを使ってスクリーンショットを撮ってPCに取り込む方法

この前にADBのセットアップ方法の投稿をしたので、今回はADBを使ってスクリーンショットを撮り、PCに取り込む方法を書こうと思います。 スクリーンショットを保存したいフォルダに移動します。 必要ならターミナルを開いて、cdコマンドを使いフォルダ移動します。 cd 移動したいフォルダのパス ※初心者の方へ、移動したいフォルダをターミナルに向けて、ドラッグ&ドロップするとそのフォルダのパスがわかります。 Androidの画面をスクリーンショット撮りたい画面にする。 スクリーンショットを撮りたい画面にしておきます。 スクリーンショットを撮影する 下記のコマンドで撮影できます。 adb shell screencap -p /sdcard/screen.png PCに取り込む 下記コマンドで取り込むことができます。 adb pull /sdcard/screen.png 最初に移動しておいたフォルダにscreen.pngの名前で保存されています。 以上です。 簡単にスクリーンショットを撮ることがでできるのでおすすめです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MaterialComponentsのテーマカラーがどこに適用されるのかを調べて見た

Androidではテーマでカラースキームを定義しますが、あらかじめ定義されている属性がどこの色指定になっているのかが分かりにくく、調べるのが結構大変ですので、どこを変更したらどこが変わるのかを調べて見ました。 AndroidStudioで新規プロジェクトを作成した時のデフォルトのテーマは以下のようになっています。 themes.xml <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/purple_500</item> <item name="colorPrimaryVariant">@color/purple_700</item> <item name="colorOnPrimary">@color/white</item> <item name="colorSecondary">@color/teal_200</item> <item name="colorSecondaryVariant">@color/teal_700</item> <item name="colorOnSecondary">@color/black</item> <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item> </style> <style name="Theme.MyApplication.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" /> <style name="Theme.MyApplication.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" /> この指定の状態と、上記の指定をすべて外してTheme.MaterialComponents.DayNight.DarkActionBarだけを指定した状態(ThemeOverlayの指定は外しています)で様々なコントロールを配置しすると以下のような表示になります。 TextViewは未指定と、TextAppearance.MaterialComponents.*を指定したものを配置しています、Headlineはフォントサイズが大きくなってしまうため、フォントサイズだけ個別に16spを指定しています。 デフォルト設定 Theme.MaterialComponents.DayNight.DarkActionBarのみ 次に、これらが一色になる設定を探ってみましょう。 themes.xml <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/red</item> <item name="colorPrimaryVariant">@color/red</item> <item name="colorOnPrimary">@color/red</item> <item name="colorSecondary">@color/red</item> <item name="colorSecondaryVariant">@color/red</item> <item name="colorOnSecondary">@color/red</item> <!-- 以下追加 --> <item name="android:windowBackground">@color/red</item> <item name="android:statusBarColor">@color/red</item> <item name="android:navigationBarColor">@color/red</item> <item name="colorSurface">@color/red</item> <item name="colorOnSurface">@color/red</item> <item name="colorError">@color/red</item> <item name="colorControlNormal">@color/red</item> <item name="colorButtonNormal">@color/red</item> <item name="colorSwitchThumbNormal">@color/red</item> <item name="android:colorForeground">@color/red</item> <item name="android:textColorPrimary">@color/red</item> <item name="android:textColorSecondary">@color/red</item> <item name="android:textColorTertiary">@color/red</item> <item name="android:textColorPrimaryDisableOnly">@color/red</item> </style> 最初の指定を全部赤指定にしてみたものが左です、残りの要素も赤一色になるように設定したものが右です。 デフォルトで指定されている色を赤に 全部が赤になるTheme ドロップシャドウの部分が残っています。これはandroid:ambientShadowAlpha android:spotShadowAlphaでα値を、また、API 28以上であれば、android:outlineAmbientShadowColor android:outlineSpotShadowColor で色を変更することができるようですが、ここまで変更することは滅多にないでしょうから外しています。 colorPrimaryVariantとcolorSecondaryVariantはandroid:statusBarColorへの指定以外では使われていないようなので以下のThemeで赤一色に変わります。 themes.xml <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/red</item> <item name="colorOnPrimary">@color/red</item> <item name="colorSecondary">@color/red</item> <item name="colorOnSecondary">@color/red</item> <item name="android:windowBackground">@color/red</item> <item name="android:statusBarColor">@color/red</item> <item name="android:navigationBarColor">@color/red</item> <item name="colorSurface">@color/red</item> <item name="colorOnSurface">@color/red</item> <item name="colorError">@color/red</item> <item name="colorControlNormal">@color/red</item> <item name="colorButtonNormal">@color/red</item> <item name="colorSwitchThumbNormal">@color/red</item> <item name="android:colorForeground">@color/red</item> <item name="android:textColorPrimary">@color/red</item> <item name="android:textColorSecondary">@color/red</item> <item name="android:textColorTertiary">@color/red</item> <item name="android:textColorPrimaryDisableOnly">@color/red</item> </style> 次に、各項目の色を変更してどこに反映されるかを検証しましょう。指定はいったん全部黒にしてしまって、一カ所ずつ赤に変更してみます。android:windowBackground android:statusBarColor android:navigationBarColorはどこの指定なのか明らかなのと、全部が塗りつぶされていると逆になんの色が変わっているのか分かりにくいので指定を外してしまいます。 themes.xml <style name="Theme.MyApplication" parent="Theme.MaterialComponents.DayNight.DarkActionBar"> <item name="colorPrimary">@color/black</item> <item name="colorOnPrimary">@color/black</item> <item name="colorSecondary">@color/black</item> <item name="colorOnSecondary">@color/black</item> <item name="colorSurface">@color/black</item> <item name="colorOnSurface">@color/black</item> <item name="colorError">@color/black</item> <item name="colorControlNormal">@color/black</item> <item name="colorButtonNormal">@color/black</item> <item name="colorSwitchThumbNormal">@color/black</item> <item name="android:colorForeground">@color/black</item> <item name="android:textColorPrimary">@color/black</item> <item name="android:textColorSecondary">@color/black</item> <item name="android:textColorTertiary">@color/black</item> <item name="android:textColorPrimaryDisableOnly">@color/black</item> </style> 初期状態 colorPrimary colorOnPrimary colorSecondary colorOnSecondary colorSurface colorOnSurface colorError colorControlNormal colorButtonNormal colorSwitchThumbNormal android:colorForeground android:textColorPrimary android:textColorSecondary android:textColorTertiary android:textColorPrimaryDisableOnly
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】実機のカメラ映像をUI上に表示させる(Android向け)

実機に掲載されているカメラの映像をUnityのUI上に表示させてみます。 この記事ではAndroidのみとなります。 環境 Windows10 Unity Hub 2.4.5 Unity 2020.3.25f1 Android Studio 2020.3.1 WebCamTextureクラス カメラの映像をUI上に表示させるために使うクラスは、WebCamTextureクラス です。 この WebCamTextureクラス は、Web カメラで映し出した映像を、テクスチャとして扱うクラスです。 UnityEngine/継承:Texture となっており、以下のように使用できます。 // WebCamTextureのインスタンスを生成 webCam = new WebCamTexture(); // RawImageのテクスチャにWebCamTextureのインスタンスを設定 rawImage.texture = webCam; UI側の準備 では、カメラ映像を表示させるための準備を行います。 まずは、UnityでUIの準備からです。 RawImageの追加 カメラの映像を投影するためのRawImageを追加します。 Hierarchy > 追加したい任意の場所を右クリック > UI > Raw Image pic.twitter.com/EAm8gdJH6I— たく (@5HdM6WlLVaazBV7) January 16, 2022 ディスプレイいっぱいになるように調節 今回ディスプレイいっぱいにカメラ映像を写したいので、設定をします。 RawImageの親要素をクリック > Inspector > Add Component から、 「Horizontal Layout Group」を追加します。 そして、以下のようにします。 Control Child Size: ✓Width ✓Height Use Child Scale: Width Height Child Force Expand: ✓Width ✓Height pic.twitter.com/e6QhiwjeR3— たく (@5HdM6WlLVaazBV7) January 16, 2022 Scriptの作成 続いては、Scriptを作成します。 任意の場所で右クリック > Create > C# Script 今回のファイル名は「WebCam」とします。 pic.twitter.com/dt4RiGEMFD— たく (@5HdM6WlLVaazBV7) January 16, 2022 そして、WebCam.csファイルを以下のようにします。 WebCam.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class WebCam : MonoBehaviour { public RawImage rawImage; WebCamTexture webCam; void Start() { // WebCamTextureのインスタンスを生成 webCam = new WebCamTexture(); // RawImageのテクスチャにWebCamTextureのインスタンスを設定 rawImage.texture = webCam; // カメラ表示開始 webCam.Play(); } } アタッチ これで準備が整ったので、アタッチしていきます。 カメラ映像を表示させたい RawImage へ WebCam.cs をドラッグ&ドロップなどでアタッチします。 そして、GameObject rawImage; には同じ要領で RawImage をアタッチします。 pic.twitter.com/jBHKhbn4ad— たく (@5HdM6WlLVaazBV7) January 16, 2022 実機で動作確認 Androidでの環境構築とbuild方法については以下の記事をご参照下さい。 Build And Run をしてカメラの画像が表示されればOKです。 Androidの場合、カメラの向きが横向きになるケースが多いのですが、その場合は以下の記事が参考になりましたので貼っておきます。 まとめ 実機のカメラ映像をUIに表示させるには、WebCamTextureクラス を使う GameObjectのテクスチャにWebCamTextureのインスタンスを設定する WebCamTextureのインスタンス.Play() でカメラ表示が開始される
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【kotlin】超簡単なMVPを実装してみた、③RemoteRepository設定(APIのやり取り)

はじめに 今回はMVP(アーキテクチャ)に沿って、RemoteRepository設定(API通信のやり取り)を実装していきたいと思います。 本記事は「【kotlin】超簡単なMVPを実装してみた、②LocalRepository設定(ローカルデータに保存、読み込み)」の内容を引き継いで実装しています。 これまでの内容は 【kotlin】超簡単なMVPを実装してみた、①Presenterの実装 【kotlin】超簡単なMVPを実装してみた、②LocalRepository設定(ローカルデータに保存、読み込み) をご参照ください 実装内容 APIは「楽天ブックス雑誌検索API」を使用する。 EditTextに文字を入力してボタンを押したら、APIから本を検索し、タイトル、画像、値段を表示する。 実装 [準備] 「楽天ブックス雑誌検索API」 から、アプリIDを獲得する。 [レイアウト] ①editText ②button ③textView ④bookTitleTextView ⑤bookImageView ⑥bookPriceTextView [コード] ・RemoteRepository設定 ①androidmanifestにを追加する。 <uses-permission android:name="android.permission.INTERNET"/> ②Retrofit設定 ※詳しい説明は割愛させていただきます。 BooksEntity data class BooksEntity( var Items: ArrayList<ItemsData>? ) data class ItemsData( var Item:ItemData? ) data class ItemData( //商品タイトル var title: String ="", //値段 var itemPrice: String ="", //画像URL var largeImageUrl: String ="", ) app/build.gradle implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' ApiService interface ApiService { @GET("20170404?applicationId=(獲得した楽天BooksアプリID)") fun getBooks( @Query("format") format:String, @Query("keyword") keyword:String, @Query("booksGenreId") booksGenreId:String, @Query("sort") sort:String, ): Call<BooksEntity> } ApiClientManager class ApiClientManager { //Retrofitクラスのインスタンス化 val retrofit = Retrofit.Builder() //ベースURLを入力 .baseUrl("https://app.rakuten.co.jp/services/api/BooksTotal/Search/") //レスポンスを変換する設定を追加 .addConverterFactory(GsonConverterFactory.create()) //Httpクライアント結合 .client(getOkHttpClient()) //onResponseバックグラウンド処理 .callbackExecutor(Executors.newSingleThreadExecutor()) .build() // サービスクラスの実装オブジェクト取得(インターフェイスを利用する) val apiClient:ApiService = retrofit.create(ApiService::class.java) private fun getOkHttpClient(): OkHttpClient { val httpClient = OkHttpClient.Builder() .readTimeout(30,TimeUnit.SECONDS) .writeTimeout(30,TimeUnit.SECONDS) .build() return httpClient } } ③RemoteRepositoryを作成 ※RemoteRepositoryの役割はPresenterに橋渡し、Presenterで使用するメソッドを定義する。 ④RemoteRepositoryで使用するメソッドを追加する。 RemoteRepository interface RemoteRepository { //④本を検索しデータを持ってくる。 fun getBooks(word: String, callback: Callback<BooksEntity>) } ⑤ApiClientManager戻り値にRemoteRepositoryを追加する。 ⑥RemoteRepositoryで設定したメソッドが出るので設定。 ApiClientManager //⑤戻り値にRemoteRepositoryを追加する。 class ApiClientManager: RemoteRepository { val retrofit = Retrofit.Builder() .baseUrl("https://app.rakuten.co.jp/services/api/BooksTotal/Search/") .addConverterFactory(GsonConverterFactory.create()) .client(getOkHttpClient()) .callbackExecutor(Executors.newSingleThreadExecutor()) .build() val apiClient:ApiService = retrofit.create(ApiService::class.java) private fun getOkHttpClient(): OkHttpClient { val httpClient = OkHttpClient.Builder() .readTimeout(30,TimeUnit.SECONDS) .writeTimeout(30,TimeUnit.SECONDS) .build() return httpClient } //⑥本を検索するメソッド override fun getBooks(word: String, callback: Callback<BooksEntity>) { apiClient.getBooks(format = "json", keyword = word, booksGenreId = "000", sort = "standard").enqueue(callback) } } ・Presenter設定 ①Presenterの引数にRemoteRepositoryを追加。 MainPresenter //①Presenterの引数にRemoteRepositoryを追加。 class MainPresenter(private val view: MainContract.View, private val localRepository: LocalRepository, private val remoteRepository: RemoteRepository): MainContract.Presenter { init { view.presenter = this } override fun start() { val text =localRepository.loadText() view.showTextView(text) } override fun onClickButton(text: String) { localRepository.saveText(text) view.showTextView(text) } } ・Contract設定 ①UIが増えたのでview側で使用するメソッドを作成。 MainContract interface MainContract { interface View: BaseView<Presenter> { fun showTextView (text: String) //①bookTitleTextViewに本のタイトルを表示させるメソッド fun showBookTitleTextView (text: String) //①bookPriceTextViewに値段を表示させるメソッド fun showBookPriceTextView (text: String) //①bookImageViewに画像を表示させるメソッド fun showBookImageView (bitmap: Bitmap) } interface Presenter: BasePresenter { fun onClickButton(text: String) } } ・View設定 ①追加したUIを獲得。 ②Contractで追加したメソッドが出てくるので、設定。 ③Presenterに引数にApiClientManager()を追加。 MainFragment class MainFragment: Fragment(),MainContract.View { override lateinit var presenter: MainContract.Presenter lateinit var editText :EditText lateinit var button :Button lateinit var textView :TextView //①追加したUIを獲得。 lateinit var bookTitleTextView :TextView lateinit var bookImageView :ImageView lateinit var bookPriceTextView :TextView override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_main, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) editText = view.findViewById<EditText>(R.id.editTextText) button = view.findViewById<Button>(R.id.button) textView = view.findViewById<TextView>(R.id.textView) //①追加したUIを獲得。 bookTitleTextView = view.findViewById<TextView>(R.id.bookTitleTextView) bookImageView = view.findViewById<ImageView>(R.id.bookImageView) bookPriceTextView = view.findViewById<TextView>(R.id.bookPriceTextView) //③Presenterに引数にApiClientManager()を追加。 presenter = MainPresenter(this, PreferenceManager(requireContext()),ApiClientManager()) presenter.start() button.setOnClickListener{ presenter.onClickButton(editText.text.toString()) } } override fun showTextView(text: String) { textView.text = text } //②bookTitleTextViewに本のタイトルを表示する。 override fun showBookTitleTextView(text: String) { bookTitleTextView.text = text } //②bookPriceTextViewに本の値段を表示する。 override fun showBookPriceTextView(text: String) { bookPriceTextView.text = text } //②bookImageViewに本の画像を表示させる。 override fun showBookImageView(bitmap: Bitmap) { activity?.runOnUiThread { bookImageView.setImageBitmap(bitmap) } } } ・Presenter設定 ①LocalRepositoryのメソッドを呼び出す。 ②通信が成功した場合、view側に反映させる。 MainPresenter class MainPresenter(private val view: MainContract.View, private val localRepository: LocalRepository, private val remoteRepository: RemoteRepository): MainContract.Presenter { init { view.presenter = this } override fun start() { val text =localRepository.loadText() view.showTextView(text) } override fun onClickButton(text: String) { localRepository.saveText(text) view.showTextView(text) //①LocalRepositoryのgetBooksメソッドを呼び出す。 remoteRepository.getBooks(text, object: Callback<BooksEntity>{ override fun onResponse(call: Call<BooksEntity>, response: Response<BooksEntity>) { if(response.isSuccessful){ //②通信が成功した場合showBookTitleTextViewを使用し、View側に本のタイトルを反映させる。 response.body()?.Items?.get(0)?.Item?.title?.let { view.showBookTitleTextView(it) } //②通信が成功した場合showBookImageViewを使用し、View側に画像を反映させる。 response.body()?.Items?.get(0)?.Item?.largeImageUrl?.let { val url = URL(it) val streem = url.openStream() val bitmap = BitmapFactory.decodeStream(streem) view.showBookImageView(bitmap) } //②通信が成功した場合showBookPriceTextViewを使用し、View側に値段を反映させる。 response.body()?.Items?.get(0)?.Item?.itemPrice?.let { view.showBookPriceTextView(it+"円") } } else { } } override fun onFailure(call: Call<BooksEntity>, t: Throwable) { } }) } } 以上、RemoteRepositoryの実装でした。 関連記事 【kotlin】超簡単なMVPを実装してみた、①Presenterの実装 【kotlin】超簡単なMVPを実装してみた、②LocalRepository設定(ローカルデータに保存、読み込み) 参考資料 Android アプリ設計パターン入門 テストが書けない人のAndroid MVP todo-mvp
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【M1Mac】Android Studioインストール後に起きたエラーたち

はじめに 念願のM1macbookを手に入れたので、諸々の設定を終えた後ウキウキしながらAndroid Studioの環境構築に取り掛かりました。 インストール自体は問題なくできたのですが、その後エミュレーターや実機でアプリを実行するときに色々とエラーに遭遇しました。(私がインストールしたArctic Foxパッチ4ではM1でも動作できるよう対応済みだったようですが、それでも詰まってしまいました。) これからM1でAndroid Studioを入れる方もいらっしゃるかと思うので、備忘録代わりに記事を書いてみようと思います。 ※エラーログなどきちんと記録していないので、大部分を記憶に頼りながら書いています。(ほとんど自分用のメモです...)もし間違いなどありましたらご指摘いただけますと幸いです。 ※記事を書き慣れていないためわかりにくい点もたくさんあるかと思います。それ以前に超絶プログラミング初心者です。お手柔らかにお願いいたします...? 実行環境 項目 情報 PC MacBook Pro (14-inch,2021) CPU Apple M1 Pro 10-core GPU Apple M1 Pro 16-core OS macOS Monterey (12.0.1) Android Studio Arctic Fox 2020.3.1 Patch4 その1 インストール後、Loading devices...が出る 上記の端末名が表示されているところが「Loading devices...」の表示になったままびくともしなくなってしまいました。(スクショ撮り忘れた) やったこと 一旦Android Studioをアンインストール こちらのサイトを参考にバシバシコマンドを打っていきました。作成済みのプロジェクトもrm -Rで削除 再度公式からインストールし、セットアップ 「SDK missing」が出たりするが、とりあえず案内に従ってnextを押していく 再度インストールすると上記の部分が「no devices」になるので、AVBマネージャーからAVDを追加する 3.で追加したAVDが表示されるようになった! ※Twitterを見ている限りだと再起動だけで直った方もいるようです。(私は直りませんでした) ※AVDを選択時、以下の画像のような形で「x86を使った方がいいよ!」と言われますが、現時点(2022年1月)ではM1チップでx86は使えない様子です(多分)。無視して適当なAVDを入れましたが、今のところ動作も実行速度も問題ないです。 その2 エミュレーター上でアプリを実行しようとするとhttps://stackoverflow.com/questions/56553879/android-studio-cause-error-86-bad-cpu-type-in-executableが出る こちらもstack overflowを参考に解決 やったこと コマンド上で $ softwareupdate --install-rosetta を打ったらこちらのエラーは表示されなくなりました。 しかし次の問題が... その3 : エミュレーター上でアプリを実行しようとするとCould not automatically detect an ADB binary. Some emulator functionality will not work until a custom path to ADB is added in the extended settings page.ダイアログが出る こちらの解答をもとに解決しました。 やったこと 画面上部のツールバーの「tools」 > 「SDK Manager」を開く 「SDK Tools」タブに移動し、「Android SDK Platform-Tools」のチェックを外す Applyをクリックし、変更を適用させる 今回は変更適用途中で固まってしまったため、一旦Android Studioを再起動させました。本来ならチェックを外してapplyしてから、もう一度チェックをつける予定でした AndroidStudioを立ち上げ直したらダイアログが消え、無事アプリが起動できるようになった! 上記で固まってしまったせいか、再起動した時「Android SDK Platform-Tools」のチェックはついたままでした。固まる前にうまいこと余分なデータか何かが消えてくれたのかもしれません(謎) やったぜ!! その他詰まった点 adbコマンドがM1では使えない 色々ググっているとadb devicesなどのabdコマンドを使う方法が出てきますが、M1ではadbコマンドを使えないようです。 (実行しようとするとbad CPU type in executable: adbと怒られてしまいました) 実機を検知してくれない 元々実機でビルドしたかったので開発者モードをオンにした状態で接続していたのですが、ググって出てきた対処法を試しても検知してくれませんでした。こちらの問題はその2かその3あたりで直りました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む