投稿

Google Playでアプリケーションの公開申請がRejectされた場合の対応

イメージ
先日Google Playでアプリケーションの公開のための申請を行ったところ、リジェクトされてしまったので、その際に対応した内容です。 リジェクトされる理由はいくつかあると思いますが、今回のケースは「 Reviewを行うためには認証情報が必要 」と行った内容でした。 リジェクト内容 結果はメールで以下のような内容で返ってきました。 App status: Rejected Your app has been rejected and wasn't published due to this policy issue. If you submitted an update, the previous version of your app is still available on Google Play. Need login credentials for app review In order for us to review your app for compliance with Developer Program Policies, we will need you to provide valid login credentials for your app. If users need credentials to access your app, please provide all appropriate credentials via Play Console. 最近ではGoogle Playでもアプリケーションの新規・更新時にレビューが行われ、ポリシーに準拠しているかどうかが確認されます。しかしアプリケーションが認証を伴うものの場合、確認用(やデモ用)の認証情報を一緒に申請しなくてはなりません。 なので確認用の認証情報を一緒に申請すればこの問題は解決します。 確認用の認証情報の設定 アプリのアクセス権を設定 ポリシー > アプリのコンテンツ > アプリのアクセス権 > 管理 を開きます。 デフォルトで「すべての機能が特別なアクセス権を必要とすることなく利用できる」にチェックが入っていますので、「すべてまたは一部の機能が制限される」をチェックします。 「+新しい手順の追加」をクリッ

【Android】ListViewで最終行までスクロールしたことを判定する

ListViewにデータの一部を表示し、最終行までスクロールした際に追加で読み込み処理を入れたいときに判定するためのロジックです。 以前作成した ListViewアプリケーション がありますので、これを使って最終行までスクロールしたときに処理を入れてみたいと思います。 https://www.s-watanabe.work/2020/12/androidcheckbox.html 実装 方法としてはsetOnScrollListenerのonScrollメソッド内で引数の値を確認して判定します。onScrollメソッドの引数は以下です。 AbsListView absListView - スクロール中のView (今回は使用しない) int firstVisibleItem - 先頭のindex int visibleItemCount - 見えている件数 int totalItemCount - ListViewのItem総件数 ※公式ドキュメントは以下です。 https://developer.android.com/reference/android/widget/AbsListView.OnScrollListener#public-methods_1 onScrollメソッドで最終行まで到達したことを判定する // メンバー変数 Boolean isLastLine = false; (省略) listView.setOnScrollListener(new AbsListView.OnScrollListener() { @Override public void onScrollStateChanged(AbsListView absListView, int i) { // } @Override public void onScroll(AbsListView absListView, int firstVisibleItem, int

[Android]簡単なTwitter Client Applicationを開発する

イメージ
Androidで、自分のTwitterアカウントと連携し、リツイートした一覧を表示するだけの簡単なアプリケーションを開発してみようと思います。 事前準備 まず事前準備としてTwitterアカウントとTwitter Deceloperアカウントの2つが必要です。Twitterアカウントに関してはほとんどの人が持っていると思うので割愛します。 Twitter Developerアカウントを作成する Twitter DeveloperのページからDeveloperアカウントの登録を行います。長いので読み飛ばしてもらっても大丈夫です。 Twitter Developerにアクセス https://developer.twitter.com/en メニューからApplyを選択 Apply for developer accountを押す 用途を選択する ここでは自分自身についてのことと、Twitter Developerアカウントをどのように使用するかといったことを選択します。 Hobbyist (趣味でやっている)、 Build Tooles for Twitter users (Twitterユーザー向けのビルドツール)、を選択しました。 ユーザーの基本情報を入力する Twitter APIの使用用途を明確に記載する ここではどのようにAPIを使用するかを、英字(200文字以上)で記述します。 簡単なアプリケーションを開発する旨を、Google先生に翻訳してもらい設定しました。 アプリケーションに関する質問 アプリケーションに関していくつか質問されます。今回は分析する予定はなし、ReadOnlyのアプリケーションなのですべてNoを選択しました。 Twitterデータを分析する予定があるかどうか アプリケーションからツイート、リツイート、DM送信などを実装するかどうか Twitter以外のコンテンツを表示するかどうか 政府機関が利用できるようにするかどうか 入力内容の確認 開発者契約、ポリシーの確認 登録用のEメールが届く Eメールの完了ボタンを押して登録完了 Developer portalのダッシュボードが開くのでここをブックマークし

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

いつものように docker-compose コマンドでコンテナを起動し作業しようとしたところ、件名のエラーが発生するようになりました。 特に何も構成等を変更した覚えはないのですが、調査・復旧したので対応した内容をまとめておきます。 環境、バージョン等 $ cat /etc/issue Ubuntu 20.04.3 LTS \n \l $ docker --version Docker version 20.10.8, build 3967b7d $ docker-compose --version docker-compose version 1.26.0, build d4451659 発生事象 コンテナを起動する docker-compose up -d でコンテナを起動します。 $ docker-compose up -d Pulling mysql (mysql:5.7)... ERROR: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host 「プロキシーサーバーが見つからない」と言われているようですが、全く見に覚えがありませんでした。 テスト用Dockerプロジェクトで試す 以前の記事 で紹介したテスト用プロジェクトでも一応試したましたが同様のエラーでした。 $ docker-compose up -d Pulling web (nginx:alpine)... ERROR: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host Docker ログイン Dockerへのログインを試したところ、こちらも同様のエラーが出ました。 $ docker login Authenticating with existing credentials... Login did not succeed, error: Error response from daemon: G

docker-compose で起動したweb、MySQLに接続できない事象

イメージ
概要 以前作成したPHP + MySQL + LaravelのDockerプロジェクトがコンテナを立ち上げても画面にアクセスできなくなってしまったときの解決方法です。 以前の記事は以下です。 【Laravel + MySQL】Dockerで開発環境を作る https://www.s-watanabe.work/2020/12/laravel-mysqldocker.html 発生事象 コンテナを起動 $ docker-compose up -d Starting laravel-project_mysql_1 ... done Starting laravel-project_app_1 ... done Starting laravel-project_web_1 ... done ブラウザでアクセス いつものようにブラウザでアクセスしますが接続できません。 http://localhost:8000 ※この時Docker側のログには何も出力されません。 MySQLへ接続 MySQLも確認してみましたが同じく接続できなくなりました。 $ mysql -h 127.0.0.1 -u user -ppassword -D test mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2 調査・確認 まず以下の記事を参考に新規のDockerプロジェクトが起動・接続できるかを確認しました。 https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04-ja # docker-compose はインストール済み $ docker-compose --version docker-compose version 1.26.0, build d

【Azure Functions】Java APIからDB(SQL Server)接続 (Win10)

事前準備 docker-composeを使ってSQL Serverをローカルで起動します。 Docker Desktop for Windows セットアップ ※すでにインストール済みであればこの手順はスキップしてください。 インストール cinst docker-desktop -y 確認 $ docker -v Docker version 19.03.5, build 633a0ea $ docker-compose -v docker-compose version 1.24.1, build 4667896b Hyper-Vの設定 Docker for Windows を使用する場合、Hyper-Vの有効化が必要です。以下手順で有効化します。 「Win + i」で設定画面を開く アプリ > アプリと機能 > プログラムと機能 を開く Windowsの機能の有効化または無効化 を開く Hiper-V にチェックが入っていなければ、チェックして再起動する データベース準備 前回の記事 で c:\TEST 以下にapiを作成したので、ここに docker-compose.yml を作成します。 c:\TEST\docker-compose.yml version: '3' services: db: image: mcr.microsoft.com/mssql/server:latest ports: - "1433:1433" environment: ACCEPT_EULA: Y SA_PASSWORD: test1234@password 起動 $ cd c:\TEST $ docker-compose up -d Starting test_db_1 ... done $ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

【Azure Funcsions】ローカルにAzure Functions[Java8]開発環境を構築する(win10)

イメージ
事前準備 chocolatey インストール chocolatey は Windows用の Package Manager (非公式)です。公式のPackageManagementのProviderにもなっています。 インストール chocolatey をインストールするには Power Shell を開いて次のように実行します。 Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) JDK(zulu8) セットアップ JDKは OLACLE のJDKではなく AZUL社のJDKを使います。OLACLE JDKはサポートしていないようで、ビルドするときにエラーになります。 Zulu JDK8 をセットアップするには コマンドプロンプトを管理者で開き次のように実行します。 セットアップ cinst zulu8 -y 環境変数 Zulu JDKのディレクトリを環境変数へ設定します。「システムの環境変数」を開き次のように設定します。 ※Pathについては既存の設定に追記します。 Path=C:\Program Files\Zulu\zulu-8\bin JAVA_HOME=C:\Program Files\Zulu\zulu-8 確認 > java -version openjdk version "1.8.0_292" OpenJDK Runtime Environment (Zulu 8.54.0.21-CA-win64) (build 1.8.0_292-b10) OpenJDK 64-Bit Server VM (Zulu 8.54.0.21-CA-win64) (build 25.292-b10, mixed mode) Maven セットアップ Maven とはJavaプロジェクトの作成、ビルド、実行を行うツールです。 Maven をセットアップするには コマンドプロンプトを管理者で開き次のように実行します。 セットアップ cinst m

【Bootstrap+Drawer.js】Drawerメニュー内にBootstrapのNavbarメニューを組み込む

イメージ
表題の通り、Drawer.jsによりスライドインするメニューの中で、Bootstrapのnavbarを使い開閉可能なサブメニューを実装します。 また、Drawer.jsを使うと実機で見たときにスクロールが正しく機能しなくなったので、そのときにとった対応をメモしておきます。 まずはBootstrapのnavbarとDrawer.jsについて簡単に説明します。 はじめに Bootstrap navbarについて Bootstrapのnavbarは開閉式のメニューを作るのに利用します。 公式 : https://getbootstrap.jp/docs/4.2/components/navbar/ メニューの開閉のコントロールをボタンで行っていますが、テキストにすることもできるので「メインメニュー > サブメニュー」のように実装することも可能です。 実装例 [クリックで表示] 上記イメージの実装が以下のようになります。 開閉ボタンにbuttonタグを使用していますが、これは何でもよくてdata-target属性にcollspaceクラスを持つコンテンツのid属性と併せておけばOKです。 <nav class="navbar navbar-light navbar-expand-md p-1"> <div class="navbar-brand sp"></div> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navmenu" aria-controls="navmenu" aria-expanded="false" aria-label="Toggle navigation"&g

【Android】動画プレイヤーのコードを利用して音楽プレイヤーを作る

イメージ
以前作成した動画プレイヤーのソースコードをほぼそのまま使って今度は音楽プレイヤーを作ってみました。 ※動画プレイヤーについては以下の記事を参考 【Android】VideoViewを使って動画再生アプリを作る① -- ストレージへのアクセス権限を取得 -- 【Android】VideoViewを使って動画再生アプリを作る② -- 内部ストレージのファイル検索 -- 【Android】VideoViewを使って動画再生アプリを作る③ -- カスタムリストビュー -- 【Android】VideoViewを使って動画再生アプリを作る④ -- 全画面で動画再生 -- 【Android】VideoViewを使って動画再生アプリを作る -- 不具合修正、軽微な修正 -- 概要 アプリケーションの特徴 アプリケーションの特徴は以下のとおりで、1-2は動画プレイヤーのコードほぼそのままです。 内部ストレージからmp3ファイルを検索してリスト表示する。 チェックボックスで複数選択し、選択アイテムを連続再生する。 再生中画面では音量調節を可能にする。 再生画面でどのファイルを再生中かわかるようにする。 再生中にホーム画面へ戻ってもアプリケーション実行中はバックグラウンドで再生し続ける。 再生中のイメージ 実装 いくつかこのアプリケーションで新たに対応した内容を記載します。 音量調節 レイアウト 音量調節はSeekBarを使って行います。 <SeekBar android:id="@+id/seekBar" android:layout_width="match_parent" android:layout_height="wrap_content" /> Mp3Activity.java Activity側ではOnSeekBarChangeListenerを設定して、SeekBarのつまみを変更したイベントで音量調節を実行します。 SeekBar seekBar = findViewById(R.id.seekBar); audioManager = (AudioManager)get

【Android】VideoViewを使って動画再生アプリを作る
-- 不具合修正、軽微な修正 --

【Android】VideoViewを使って動画再生アプリを作る で作成したアプリを使っていたところ使いにくい点を発見したのでいくつか改修を入れました。 対応した内容 再生中にスリープモードにしない ファイルサイズを動画の総再生時間に変更 チェックボックスを付けて複数ファイルの再生に対応 再生中にスリープモードにしない この対応は簡単で動画再生するActivityで以下1行入れるだけです。 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); ファイルサイズを動画の総再生時間に変更 これはトップ画面のファイルリストでファイルサイズを表示していましたが、あまり意味が無いので再生時間を取得して表示するようにしました。以下のようにメソッド化したのでFileオブジェクトを渡してやれば秒数が返ってきます。 /** * 動画ファイル再生時間取得 * @return int */ public static int getDuration(File audioFile) { try { MediaPlayer mediaPlayer = new MediaPlayer(); FileInputStream inputStream = new FileInputStream(audioFile);; FileDescriptor fileDescriptor = inputStream.getFD(); mediaPlayer.setDataSource(fileDescriptor); mediaPlayer.prepare(); int length = mediaPlayer.getDuration(); mediaPlayer.release(); return length / 1000; } catch (Exception e) { return 0; } } これで取得した再生時間をAdapterでListViewにセットするときに以下のように分と秒で分けてやり表示

【Android】カスタムリストビューにCheckBoxを追加したとき別の行までチェックされる事象の対応

AndroidでCheckBox付きのカスタムListViewを実装し、動作確認したところチェックした行以外の行までチェックされてしまう謎現象が発生しました。 カスタムListViewの実装については以下参照 【Android】VideoViewを使って動画再生アプリを作る③ -- カスタムリストビュー -- 今回は単純にチェックボックスと単純な名前を一つだけ持ったListを表示しています。 問題のあるコード Adapterクラス public class ListAdapter extends ArrayAdapter<String> { private int resource; private List<String> items; private LayoutInflater inflater; public ListAdapter(Context context, int resource, List<String> items) { super(context, resource, items); this.resource = resource; this.items = items; this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view; if (convertView != null) { view = convertView; } else { view = inflater.inflate(resource, null); } TextView itemName = view.findViewById(R.id.item_name)

【Laravel + MySQL】簡単な認証処理を作る

イメージ
前回作成したLaravelアプリケーションに認証処理を実装します。 データベースの作成 ユーザーテーブル作成 Laravel 6.2 にはセットアップした段階で以下の migration 用のコードが入っていますのでこれを実行します。(※今回使用するのはusersテーブルだけです。) 2014_10_12_000000_create_users_table.php 2014_10_12_100000_create_password_resets_table.php 2019_08_19_000000_create_failed_jobs_table.php $ php artisan migrate Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.41 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (0.43 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.31 seconds) ※migrationでエラーになるという場合は 【Laravel + Docker】migration で could not find driver が出たときの対応 が参考になるかもしれません。 ユーザーデータの登録 次にseedという機能を使ってデータを登録します。これはテストデータやマスターデータなど、開発するにあたって必要なデータを登録する機能です。 database/seeds/DatabaseSeeder.php DatabaseSeeder クラスは最初からあるコードで、このrunメソッドに記載されている seed が

【Laravel + MySQL】Dockerで開発環境を作る

イメージ
Docker、docker-compose.yml を利用して次の開発環境を作成する手順をまとめました。 WEBサーバー nginx:1.15.6 データベース mysql 5.7 アプリケーション php 7.2 フレームワーク laravel 6.2 構成について まずプロジェクト全体の構成は以下のようになっています。 . ├── docker │   ├── mysql │   │   └── my.cnf │   ├── php │   │   └── Dockerfile │   └── web │   └── default.conf ├── docker-compose.yml └── laravel-app 基本的には docker-compose.yml を用いてビルドしますが、PHPのみDockerfileを使います。 ※後に記載しますが、pdo_mysqlをコンテナにセットアップしたいためです。(これが分からなくて少し嵌りました。) 各ファイルについての詳細 Docker Compose docker-compose.yml docker-compose.yml の内容は以下です。 version: '3' services: web: image: nginx:1.15.6 ports: - '8000:80' depends_on: - app volumes: - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf - .:/var/www/html app: build: ./docker/php volumes: - .:/var/www/html depends_on: - mysql mysql: image: mysql:5.7 command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci environment: