20220115のAndroidに関する記事は4件です。

UnityでAndroid向けにbuildして実機で動作確認する方法

基本的な内容ですが個人のメモとして残します。 環境 Windows10 Unity Hub 2.4.5 Unity 2020.3.25f1 Android Studio 2020.3.1 Unity側のbuild準備(SDK等の設定) Android向けの環境構築方法については以下の記事を参照。 Android側の設定を開発者モードにする Unity側の設定が終わったら次は Android 側の設定を行います。 機種によって異なりますが、 「設定」 > 「システム」 > 「端末情報」 に行くと「ビルド番号」という項目がありますので、7回ほどタップします。 すると「開発者モードになりました」というようなメッセージがでます。 Android側でUSBデバッグモードにする 続いては、Android側でシステムの画面まで戻ると、 「開発者向けオプション」というような項目が追加されていますので、 項目をタップして画面遷移します。 少し下の方へスクロールすると、「USBデバッグ」という項目がありますので、 ONにします。 PCとAndroidをつなぐ PCとAndroidをUSBでつなぎます。 ※USB使用モードは「ファイルを転送」にする必要があります。 (上から下にスワイプして出る通知バーに項目があります) Unity側でBuild And Run あとは、Unity側でしっかり設定をしていれば「Build And Run」をして実機側で開発中のアプリが起動されます。 (少し時間がかかります)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

TimberでJetpack Composeのログを良い感じに。

はじめに こんにちは。 今日はJetpack Composeのログについて書こうと思います。Viewを使用していた時はピュアなandroid.utilで事足りていましたが、Jetpack Composeでは基本Composable関数単位でログのタグを出力したいと思い調べてみました。 約二年Androidエンジニアをしていますが、Timber初めて使ってみました。ふふふ。 どうするの? Timberというログ出力ライブラリを使用します。実際はandroid.utilをラップした軽量のライブラリだそうです。Timberについて詳しく知りたい人はこちらを覗いてみてください。 やることは以下です。 1. Timber.DebugTreeを継承したクラスを作り、自分好みにカスタマイズ! 2. Applicationクラスにて(1)で作成したクラスを初期化する。 Timber.DebugTreeを継承したクラスを作り、自分好みにカスタマイズ! TimberSetting.kt class TimberSetting( private val context: Context ): Timber.DebugTree() { // 引数のtagはcreateStacElementTagで作成したもの // ユニークなTAGを入れておくと、自アプリのログだけでfileterできる。 override fun log(priority: Int, tag: String?, message: String, t: Throwable?) { super.log(priority, "YOUR_UNIQUE_TAG" + tag, message, t) } // TAGを生成する。引数のelementからファイル名や行数などを取得できる。 override fun createStackElementTag(element: StackTraceElement): String { return String.format(" [C:%s] [L:%s] [M:%s]", super.createStackElementTag(element), element.lineNumber, element.methodName) } } Applicationクラスにて(1)で作成したクラスを初期化する。 MyApplication // AndoridManifest.xmlへの追加を忘れずに! class MyApplication: Application() { override fun onCreate() { super.onCreate() if (BuildConfig.DEBUG) { Timber.plant(TimberSetting(this)) } } } 以上の実装で以下のようなログが出力されます。 MainActivity @Composable fun Main() { Timber.i("Main Composable!") //20行目 } I/YOUR_UNIQUE_TAG [C:MainActivityKt] [L:20] [M:Main]: Main Composable! さいごに Jetpack ComposeでTimberを使ってみました。いや、これJetpack Composeじゃなくても良かったじゃん。とはいえメソッド名出せるの良いですね。もっと前から使っておけば良かった~。 以上です。それではまた次の記事で! 参考 stack overflowの質問
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【kotlin】超簡単なMVPを実装してみた、②LocalRepository設定(ローカルデータに保存、読み込み)

はじめに 今回はMVP(アーキテクチャ)に沿って、LocalRepository設定(ローカルデータに保存、読み込み)を実装していきたいと思います。 本記事は「【kotlin】超簡単なMVPを実装してみた、①Presenter」の内容を引き継いで実装しています。 これまでの内容は 【kotlin】超簡単なMVPを実装してみた、①Presenterの実装 をご参照ください 実装内容 LocalRepository(ローカルデータに保存、読み込み)まで実装する。 ①EditTextに文字を入力してボタンを押したら、文字を保存し、下部のTextViewに表示させる。 ②アプリを閉じ、再起動したら保存した文字を読み取り、下部のTextViewに表示させる。 実装 [レイアウト] ※前回と同じです。 ①editText ②button ③textView [コード] ・LocalRepository設定 ※LocalRepositoryの役割はPresenterに橋渡し、Presenterで使用するメソッドを定義する。 ※SharedPreferencesを使用する。 ①LocalRepositoryを作成。 ②LocalRepositoryで使用するメソッドを追加する。 LocalRepository interface LocalRepository { //②文字を保存するメソッド fun saveText(text: String) //②文字を読み込むメソッド fun loadText():String } ③PreferencesManagerを作成。 ④戻り値にLocalRepositoryを導入する。 ⑤SharedPreferenceインスタンス化。 ⑥LocalRepositoryで設定したメソッドが出るので設定。 ※SharedPreferencesの使い方は割愛させていただきます。 PreferenceManager //④戻り値にLocalRepositoryを導入する。 class PreferenceManager(context: Context): LocalRepository { //⑤SharedPreferenceインスタンス化。 val sharedPref = context.getSharedPreferences("my_settings", Context.MODE_PRIVATE) //⑥文字を保存する処理 override fun saveText(text: String) { sharedPref.edit().putString("a",text).apply() } //⑥文字を読み出す処理 override fun loadText():String { return sharedPref.getString("a","初期値")!! } } ・Presenter設定 ①Presenterの引数にLocalRepositoryを追加 ②LocalRepositoryのメソッドを呼び出し使用する。 MainPresenter //①Presenterの引数にLocalRepositoryを追加 class MainPresenter(private val view: MainContract.View, private val localRepository: LocalRepository): 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) } } ・View設定 View側 ①Presenterに引数にpreferenceManagerを追加 MainFragment class MainFragment: Fragment(),MainContract.View { override lateinit var presenter: MainContract.Presenter lateinit var editText :EditText lateinit var button :Button lateinit var textView :TextView override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { 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) //①Presenterに引数にpreferenceManagerを追加 presenter = MainPresenter(this, PreferenceManager(requireContext())) presenter.start() button.setOnClickListener{ presenter.onClickButton(editText.text.toString()) } } override fun showTextView(text: String) { textView.text = text } } 以上、LocalRepositoryの実装でした。 次回Retrofitを使用したRemoteRepository設定(APIのやり取り)の設定を記事にしたいと思います。 関連記事 【kotlin】超簡単なMVPを実装してみた、①Presenterの実装 【kotlin】超簡単なMVPを実装してみた、③RemoteRepository設定(APIのやり取り) 参考資料 Android アプリ設計パターン入門 テストが書けない人のAndroid MVP todo-mvp
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Canvas#drawTextを使用している部分での「最新の絵文字のサポート」対応

2022/2からGoogle Play Storeのストア規約に「Android 絵文字ポリシー」が加わり、古い端末でも最新の絵文が表示できるようサポートすることが求められるようになります。 Android 絵文字ポリシー TextViewを継承しているコンポーネントを使用している部分は、AppCompat(v1.4以上)を用いたり、AppCompatを用いない場合もemoji2ライブラリを使用することでほとんど何もしなくてもorかなり簡単に対応できるよう公式のサポートがあります。 最新の絵文字のサポート しかし、Canvas#drawText を使用していている部分(例えば画面表示を元にCanvas(とBitmap)を使用してスクリーンショット風の画像ファイルを1から生成しているときや、TextViewを使わずに完全なカスタムViewでonDraw()メソッドでCnavasに直書きしているときなど)は、上記の公式サイトの内容では不十分だと思います。 そのようなシチュエーションでの最新の絵文字のサポートへの対応方法について記述しています。 Before(最新の絵文字のサポート対応前) // canvas : 描きたい対象のCanvasインスタンス // 描きたいテキスト val titleStr = "×××" val textPaint = Paint().apply { color = android.graphics.Color.BLACK } val rect = Rect() textPaint.getTextBounds( titleStr, 0, titleStr.length, rect ) // 描きたいテキストの描いた時の横幅を取得 val textWidth = textPaint.measureText(titleStr) // canvas の上寄せ・横方向中央寄せに描く val textMarginTop = 8f // テキストの上方向のマージン canvas.drawText( titleStr, (canvas.width - textWidth) / 2, rect.height().toFloat() + textMarginTop, textPaint ) After(最新の絵文字のサポート対応後) app/build.gradle  dependenciesにandroidx.emoji2:emoji2を追加します。 (略) dependencies { (略) def emojiVersion = "1.0.1" implementation "androidx.emoji2:emoji2:$emojiVersion" } kotlinコード // canvas : 描きたい対象のCanvasインスタンス val titleStr = "×××" // そのまま canvas.drawTextとすると、端末のデフォルトの絵文字が使われてしまう。 // 最新の絵文字を表示しようとすると豆腐になった、となる可能性があるのでEmojiCompatを使用するようにする。 val emoji = EmojiCompat.get().process(titleStr) val textPaint = Paint().apply { color = android.graphics.Color.BLACK } // StaticLayout+EmojiCompatに作ってもらったCharSequenceを使用すると、Canvasに対しても最新の絵文字を描ける。 val layout = StaticLayout.Builder .obtain( emoji!!, 0, emoji.length, TextPaint(textPaint), canvas.width ) .setAlignment(Layout.Alignment.ALIGN_CENTER) // setAlignment(Layout.Alignment.ALIGN_CENTER)で横方向中央寄せは実現 .build() // canvas の上寄せ・横方向中央寄せに描く val textMarginTop = 8f // テキストの上方向のマージン canvas.save() // 上寄せで上にマージンを適用するためにCanvasの原点をずらす canvas.translate(0f, textMarginTop) layout.draw(canvas) canvas.restore()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む