awacleberryの備忘録

アナログ人間のデジタル日記。

【Android】コマンドラインからエミュレータを起動する

コマンドラインからエミュレータを起動する方法をいつも忘れてしまうので、メモ。

#エミュレータ名を表示
emulator -list-avds

上記コマンドでリストが表示される。

#エミュレータ名を指定して起動
emulator @名前

@ を忘れずに名前の前へ置く。

【iOSのアプリ申請】スクリーンショットが原因でリジェクト

審査落ちの理由

iPhoneスクリーンショットで使っている端末画像の素材を iPad のほうと共用していたため、リジェクトされた。iPad 用のスクリーンショットなのに、写ってる端末は iPhone じゃん、というご指摘。これまで何も言われなかったけど、Appleさんが、急に気になりだした模様。

We noticed that your screenshots do not sufficiently reflect your app in use.

Specifically, your iPad Pro screenshots display iPhone

Please see attached screenshots for details.

Next Steps

To resolve this issue, please revise your screenshots to ensure that they accurately reflect the app in use. For resources on creating great screenshots for the App Store, you may want to review the App Store Product Page information available on the Apple developer portal.

Please ensure you have made any screenshot modifications using Media Manager. You should confirm your app looks and behaves identically in all languages and on all supported devices. Use Media Manager to add custom screenshots for each display size and

Since your iTunes Connect status is Metadata Rejected, we do NOT require a new binary. To revise the metadata, visit iTunes Connect to select your app and revise the desired metadata values. Once you’ve completed all changes, reply to this message in Resolution Center and we will continue the review.

NOTE: Please be sure to make any metadata changes to all app localizations by selecting each specific localization and making appropriate changes.

Google 翻訳にかけると、

あなたのスクリーンショットでは、使用中のアプリが十分に反映されていないことがわかりました。

具体的には、iPad ProのスクリーンショットiPhoneが表示されます

詳細は付属のスクリーンショットをご覧ください。

次のステップ

この問題を解決するには、スクリーンショットを改訂して使用中のアプリが正確に反映されるようにしてください。 App Storeの素晴らしいスクリーンショットを作成するためのリソースについては、Appleの開発者ポータルにあるApp Storeの製品ページの情報を参照してください。

Media Managerを使用してスクリーンショットを変更したことを確認してください。アプリの外観を確認し、すべての言語とサポートされているすべてのデバイスで同じように動作する必要があります。 Media Managerを使用して、各ディスプレイサイズのカスタムスクリーンショットを追加し、

あなたのiTunes ConnectステータスはMetadata Rejectedであるため、新しいバイナリは必要ありません。メタデータを修正するには、iTunes Connectにアクセスしてアプリを選択し、目的のメタデータ値を修正します。すべての変更を完了したら、解決センターでこのメッセージに返信し、レビューを続行します。

どうでもいいが、Google 翻訳のクオリティが高い……。

修正&返信

以下が返信。

Thank you for your review. I fixed the screenshots that you pointed out immediately. Specifically, I changed the images of iPhone used in the screenshots for iPad to the images of iPad. I would be pleased if you could review it again.

Best regards

(ja) この度はご審査頂き有難う御座います。早速、ご指摘頂いたスクリーンショットの問題へ対応致しました。具体的には、iPadスクリーンショットで使用していたiPhone画像を、iPad画像へと修正しております。再審査のほど、何卒宜しくお願い申し上げます。

こんなとこで、たぶん大丈夫だと思う。

【Android】TextView の SetTextSize についてのメモ

TextView に 文字サイズを指定する方法についてのメモ。

getDimention して setTextSize をする

#setTextSize(float) にあるように、

void setTextSize (float size)

と引数一つの場合は、sp の指定となる。

dimens.xml で定義したサイズを取得する際に以下のようにするが、この返り値は px 変換されたものなので、都合が悪い。

getResources().getDimension(R.dimens.hoge);

次のようにすると、sp 値を px 値変換したものを sp 値として設定してしまうことになる(xml で sp 値を定義しているのが前提)。

tv.setTextSize (getResources().getDimension(R.dimens.hoge));

sp 値を px 値変換したものを px 値として渡すには、単位付きのメソッドを使用する。

void setTextSize (int unit, float size)

#setTextSize(int, float) にあるように、第1引数には、TypedValue で定義された定数を使う。

tv.setTextSize (TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimens.hoge));

こうすれば、一応意図した値を設定できる。

OS のフォントサイズ設定を無効にする

sp はディバイスで設定できるフォントサイズの倍率が掛けられるので、タブなどの限られた領域でフォントサイズを指定する場合には都合が悪い。

xml で sp 値を設定していて、かつ、OS のフォントサイズの影響を受けないようにするには、設定されている倍率を取得して割れば良さそう。

float scale = getResources().getConfiguration().fontScale;
tv.setTextSize (TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimens.hoge) / scale);

そもそも xml で dp 値として定義できれば、それでも良さそう。あるいは、dp の数値を float で取得できるなら、TypedValue.COMPLEX_UNIT_DIP の単位指定をし、

float dpVal = 20;
tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, dpVal);

とかが考えられそう。

【Android】WebView にキャッシュをさせない方法

サイト更新後すぐに反映させたい場合などに、WebView がキャッシュを表示してしまうと困る。

WebView にキャッシュをさせないようにするには、CacheMode に LOAD_NO_CACHE を指定する。

WebView wv = (WebView)this.findViewById(R.id.webview);
wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

Address already in use の対処法

たまにビルドインサーバーの遮断し忘れとかで Address already in use がでるので、対処法をメモ。

まず、ポート番号を指定して、実行中のプロセスを確認し、

lsof -i:8888

出力された PID をコピーして、以下のコマンドで遮断する。

kill ${PID}

【Android】View の id とエントリ名の変換

エントリ名から id を取得

hoge というエントリ名から、R.id.hoge という id の数値を取得するなら、

int viewId = getResources().getIdentifier("hoge", "id", getPackageName());

この viewIdfindViewById(viewId) できる。for で連番しているエントリ名などから View を取得するのに便利。

id からエントリ名を取得

逆に、id の数値からエントリ名を取得するなら、

String viewIdStr = getResources().getResourceEntryName(viewId);

View から getId() とかで id さえ取得していれば、それを上記のようにエントリ名へ変換して正規表現でチェックとかできる。

他のリソース

View の id 以外でもできる。

int strId = getResources().getIdentifier("hoge", "string", getPackageName());

注意点

getIdentifier について、ドキュメント曰く、

Note: use of this function is discouraged. It is much more efficient to retrieve resources by identifier than by name.

オススメできない方法とのこと。

getIdentifier

Mac の ターミナルで tree を表示

tree をインストー

brew install tree

tree を表示

当該ディレクトリで、

tree

パスを指定するなら、

tree .

など。日本語が文字化けする際は、

tree . -N

でOK。表示するディレクトリの深さをしていするなら、

tree -L LEVEL

次のような感じに表示される。

.
├── CHANGELOG.md
├── LICENSE
├── README.md
├── assets
│   ├── fonts
│   ├── images
│   ├── javascripts
│   └── stylesheets
├── eyeglass-exports.js
└── package.json

パスを書く必要がある際には便利。他、使いそうなオプションは、

オプション
-a 隠しファイルも表示
-d ディレクトリのみ表示
-P 正規表現にマッチするものを表示
-F ディレクトリ末尾にスラッシュを表示
-o 書き出し