Translate

BTemplates.com

Powered by Blogger.

2017年11月29日水曜日

Adwordsの広告の表示回数について問い合わせてみた


現在、VoiceTimerというアプリを宣伝するために
Adwordsを使っているのですが、言語によって同じ国でも表示回数が違うことが
ありました。
そこで前に問い合わせてみたところ、今日返事が返ってきたので書き起こしておきます。

結論から述べると、広告を設定する際にターゲットとした言語の種類によって
大いに影響を受けるみたいです。

話を聞いた限りでは、どうも広告文の内容も影響を受けない訳ではないみたいのですが、
そこを変えるよりは、広告に設定した言語を変更したほうが効果があるようなニュアンスでした。

で、書いている途中で気が付いたのですが、これ複数の言語の設定をした場合は
どうなるんでしょうか?

他にも質問したいことはあるので、その時にまた今度聞いておきます。



2017年11月27日月曜日

VoiceTimerを公開して3ヶ月ぐらい保守対応して思った事を纏める


前にVoiceTimerを公開して反省点をまとめた記事を書いたのだが
あれから三ヶ月くらい色々試して改めて思ったことがあるのでそれを簡単に纏めます。


◆ダウンロード数≒認知数。ただし、十分質を満たしていない場合は、そうなるとは限らないかも。

今回、アプリを公開して強く思ったのがこれです。
Adwordsで片っ端から宣伝を打つようになってから、一気にダウンロード数が増えました。11月に限って言えば、現時点で1300ダウンロードもされています。
ただ、いくら有名且つ無料であっても、不要なものや要らないものや質が悪いものはダウンロードしないと思うので、そういう意味では必要とされるものである事とアプリの質は大事だと思っています。
今回のアプリの質が良いと思っているのは、自分自身がそう思っているのもありますが、確信を得ることができたのは、たった二つですが評価で★5をもらえたからです。
無論、この後もずっと★5をもらえる保証はどこにもないですが、本当に駄目なものは★5はもらえないと思っているので、そういう意味ではかなり自信になりました。


◆ローカライズは意味もなく増やすと、更新対応で死ねる。タブレットも対応していると苦労も倍になる。

VoiceTimerに限って言えば、新しいローカライズを増やすごとに以下の作業が必要になります。

◎アプリの翻訳をする
◎各解像度のアプリの動作テストをする(文字が入りきらない場合があるので、その場合は類義語を探さなくてはならない)
◎GooglePlay用のキャプチャー画像を用意する
◎GooglePlay用の説明画像を用意する
◎GooglePlay用の7インチタブレット、10インチタブレットそれぞれのキャプチャー画像を用意する
◎GooglePlayの説明文の翻訳を作る
◎Youtubeの翻訳と字幕を作る
◎Adwordsの広告を作成する
◎GooglePlayのアプリを更新する際の更新内容を各言語に翻訳する

しかも場合によっては、此処までやったのに
対応した言語で全然ダウンロードされないという事もあります。
具体的にいうと、フィリピン語。
ヒンディー語も最近二件ダウンロードされたけど、正直ちょっと割に合わない。


◆ローカライズとグーグルアンケートは相性が悪い。

各言語ごとにグーグルアンケートを作らないといけないので
纏めて集計することができないし、そもそも数が集まらない。
冷静に考えて現時点でGooglePlayでのレビューすらないのに
アンケートなら集まると考えていた自分が浅はかだった。
細かい使用感は、テストを依頼するか、もしくはレビューをお願いするかで
それなりに知ることができる。
また、どんな人が使っているかに限っていえば
FireBaseで大まかに年齢と性別がわかるのでそっちである程度知ることができる
明言はしないが、VoiceTimerのアンケートの項目はアプリ内に問い合わせのページを作ることができたら、撤廃する予定である。


◆広告アプリ一本で生活は無理

現時点で毎日1円は安定して稼げそうな状態にはなっているのですが
最低限の引き落とし金額が8000円な事を考えると
これで生活はどう考えても無理です。
まぁ、ダウンロードが1万すら届いていないことを考えれば
当然ではあるのですが。
今だからこそ言いますが、公開した当初は根拠なく一万ダウンロード位行くだろうと
うぬぼれていました。


◆GooglePlayの表示順番は、同じ作者が公開されている他のアプリの状況も影響に入っているっぽい?

単純にアプリを一つしか公開していないのが自分だけという可能性もありますが、競合が多いアプリは、大抵ほかのアプリも複数公開していたのでそれを考えると多少は影響しているのかもしれません。少なくともインストール数が多い順に表示されるとかではないのは確かです。


◆体感であるが割と雑な仕事をしている人が多い

これは自分も含めてという話ではあるのですが
折角、GooglePlayで日本語で説明文を書いているのに
更新内容は英語だったりとか、中途半端にローカライズ対応しているなどありました。
Adwordsの日本でのリーチ数を見る限りでは、それなりに数がいることを考えると
少しもったいないのではと思わざる得ないです。

ただ、アメリカとかは自分のデータを見た限りでも、英語とスペイン語でそれぞれダウンロードしている人がいるので、他の言語があるというのが日本と違って結構当たり前なのかもしれません。
また、私のアプリのバグ対応の中で、ローカライズの切り替えをしてクラッシュされるひとが確認できている限りでは21人もいたことを考えると状況によって別の言語を使い分ける必要があるのかもしれません。
*現バージョンでは対応済みです。クラッシュした人はアップデートしてみて下さい。

それを踏まえて、はた目から見て一見案外雑なローカライズをしているように見えて
彼らの基準で言えば、割と真面目にやっている方なのかもしれません。

ただ、個人で全てに対して丁寧な対応をするとキツイので、一概に何とも言えない部分はあります。


◆Youtubeは案外見てくれる。30秒くらいは。

アプリを公開したばかりの時は、そもそも公開されていることを知らないこともあり
全然見られていなかったですが、最近では大体一日10人くらい見てくれます。
ただ、単純な動作説明動画のせいか、30秒くらいしか見てくれず
稀に一分くらいみて、極々稀に全部見る人がいるくらいです。
大まかに再生時間と、動作説明ぐらいは書いても良かったかもしれません。
そもそも、動作説明動画を作ろうと思ったのは、参考にするために他のキッチンタイマーをインストールしてみたところ、意外とわかりにくい動作や見落としがちな機能がありました。
その為、説明動画あったほうが親切だと思ったので、説明動画を作りました。



◆面白さの共通化は難しいが、困った事の共通化は面白さに比べると簡単かもしれない。

まず、面白いを伝えるのに、言語に依存することが多く、面白いと感じるのに文化に依存する部分が多いと考えています。一方で、文化に依存する問題もそこそこありますが、
(例:西暦を和暦で考える。状況によって言語を切り替える等)困っていることというのは案外他の場所でも変わらないのではないかと思っています。
明確な根拠があるわけではなく今回このアプリを公開して何となく感じた話で申し訳ないのですが、そう思いました。



2017年11月26日日曜日

2017-11-26 到達点メモ


最近、広告によるダウンロード数が鈍化してきた。
一時的なものなのか、半永久的なものなのかは現在のところではわからない。
国ごとの広告の表示回数を見る限りではまだやりようがあるとは思うのだが、ローカライズの対応を増やすのと金額を増やす以外で何かいい方法はないのだろうか?

Adwordsで表示する説明文を変更する際に、広告アセットでの表示順番と表示する説明文の表示順番は一致しないことがあるので注意。

国コードを度忘れした時は下記のサイトで調べると便利
https://www.benricho.org/translate/countrycode.html


昨日の記事でも最後の方で少し書いたが、Adwordsは同じ対象地域でも言語によって
表示回数が異なるように見えるのでちょっと問い合わせてみた。
返事が返ってきたら記事として書いてみようと思う。

今日はここまで。





2017-11-25 到達点メモ


割と当たり前な話ではあるが、ファイルをコピーして新しいデータを作る際に
似たような言語だと、修正したのかしていないのかわかりにくくなるため
辞めたほうが良い。
具体的には、中国語の簡体字と中国語の繁体字

助詞をどこに配置するかで翻訳した際に意味がかなり変わる時がある。

◎日本語
右上のボタンを押すことで、開発者に質問することが簡単にできます
右上のボタンを押すことで、簡単に開発者に質問することができます

◎中国語(繁体字)
通過按右上方的按鈕,您可以輕鬆地向開發人員提出問題
通過按下右上角的按鈕,您可以輕鬆地詢問開發人員

◎上記の文を再度日本語に翻訳
右上のボタンを押すと、簡単に開発者に質問することができます
あなたは簡単に右上のボタンを押すことによって開発者に尋ねることができます

ちょっと調べてみたが、【簡単に開発者に質問することができます】という文に対して最初は並列助詞なのではないかと考えていた。
しかし、コトバンクの内容を見るに二つ以上の言葉を対等に繋げるとの事から、そもそも日本語の文法自体が間違っているように感じる。
「簡単に」という言葉が、「できます」を指していることを考えれば
やはり文章として間違っているのかもしれない。

なんか最近日本語の勉強ばっかしている気がする。


メモとして残しておくが、adwordsの広告やGooglePlayConsoleの国の言語を見る限り
母国語=ダウンロードされるとは限らないみたい。
割と顕著なのがヒンディー語かな。
Adwordsの広告をヒンディー語で打っても全然表示されないし、インストールされた言語の中に一台もヒンディー語がない。

VoiceTimerは、今後の他のアプリのローカライズを参考にするために
もっと色々試してみるべきかもしれない。

今日はここまで



2017年11月25日土曜日

2017-11-21 、25 到達点メモ


ローケルの動作確認をしていて、中国語の簡体字と中国語の繁体字の見分け方が分からなかったので、現在のデバイスのローケルを知るための方法を調べていた。

コード的には以下のとおりである。
*Kotlinで書いています。

        val locale:Locale = Locale.getDefault()
        val language:String = locale.language
        val country:String = locale.country
        local_text.text = locale.toString()
        language_text.text = language

        country_text.text = country


まず分かった事として、

1.繁体字は三つの国があり、それぞれの言語コードがある。

台湾:zh_TW_#Hant
澳門(マカオ):zh_MO_#Hant
香港:zh_HK_#Hant


2.上記三つはzh(中国語の簡体字)の代わりにはならない。

3.此処では関係ないけどリーチ数的には、繁体字を対応したほうが絶対多い。

実際に実装してどうなるかは、また今度検証します。

それとは別にバージョン名とかも知っておきたいと思ったので
以下メモ
//Androidのバージョン。7.0とかの事

        version_text.text = Build.VERSION.RELEASE
//SDKのバージョンAPI24とかの意味
        version_sdk_text.text = Build.VERSION.SDK_INT.toString()



実際に台湾や香港やマカオのローカライズで使う場合は
以下のように設定する必要がある
ちゃんと設定すると国旗が出ます

zh-rTW = 台湾
zh-rHK = 香港
zh-rMO = マカオ

参考サイト:メモ[リソースを多言語/国別化する]


それとは別にAdwordsの広告の設定を調べていたらちょっと面白い設定を見つけた
SMART_BANNERという設定である。

これを使うと横の長さに応じて自動的に調整してくれる。
ただ、今回に限って言えば、どちらかというと LARGE_BANNERの方が
趣旨に合っていたので今回はスルーする

参考サイト:バナー広告のバナーのサイズ

とりあえず、大まかには検証が終えたので
日曜日までには更新できるようにしたい。

今日はここまで。


2017年11月18日土曜日

2017-11-17 到達点メモ


翻訳置き換えメモ

リセット機能がある→リセット機能付き
タイマー終了→タイマーが切れた

今日は、Google翻訳でロシア語の翻訳をしていたのだが
ちょっとした文字の切り貼りをするだけでかなり翻訳が変わったので
貼っておく

例:
◆翻訳元の日本語
◎操作が分かりやすいキッチンタイマーを探している
◎操作が分かりやすいキッチンタイマーを探している人
◎私は、操作が分かりやすいキッチンタイマーを探している
◎私は、操作が分かりやすいキッチンタイマーを探している人

◆ロシア語に翻訳
◎ Я ищу кухонный таймер с удобной для понимания операцией
◎ Люди, ищущие таймер для кухни, легко понимают работу
◎ Я ищу кухонный таймер с удобной для понимания операцией
◎ Я ищу таймер для кухни, который легко понять

◆そのロシア語を基に、日本語に翻訳
◎わかりやすいキッチンタイマーを探しています
◎キッチンのタイマーを探している人は、簡単に仕事を理解する
◎わかりやすいキッチンタイマーを探しています
◎わかりやすいキッチン用のタイマーを探しています

最初は動詞の有無が原因かと思ったが、どうも文脈で主語が不明だと
意味不明な文になるのではないかと思った。
何故なら、「◎操作が分かりやすいキッチンタイマーを探している」は
探しているという動詞から考えて、主語は私と考えるのが一般的だと思っている。
しかし、「◎操作が分かりやすいキッチンタイマーを探している人」だと文脈から
誰が主語かわからないから変な文脈になったのではないだろうか?

一度、文を考え直したところ言いたいことは以下のようではないかと思った。
『あなたが使いやすいキッチンタイマーを探しているなら、このアプリをお勧めします。』
それを踏まえて、再度ロシア語に翻訳して日本語に翻訳したところ以下の通りになった。

◆日本語
◎ あなたが使いやすいキッチンタイマーを探しているなら、このアプリをお勧めします。

◆ロシア語
◎ Если вы ищете кухонный таймер, который прост в использовании, я рекомендую это приложение.

◆再度日本語に翻訳
◎使いやすいキッチンタイマーをお探しなら、このアプリをおすすめします。

翻訳用の文を考えるときは、日本人は主語を意識しないとダメな気がする。

あと、二重主語も翻訳をするうえで結構問題になるような気がする。
言葉としては聞いたことがなかったが、私が単に知らないだけでそこそこ一般的な概念のようである。
インドネシアに、そのような概念があるそうである。
二重構文の具体例をあげると、象は、鼻が長い。
「象は」で一つの主語であり、「鼻が」でもう一つの主語がある。

参考サイト:日本語の文法に二重主語ってありますか?
参考サイト:二重主語構文
参考サイト:アルビーのインドネシア語教室-入門講座【主語の話(二重主語構文)】

……と思っていたのだが、どうやらグーグル翻訳は本当に謎の動きをする。
二重主語も問題はあるようだが、それ以外も問題である。
以下が具体例。


◆日本語
貴方はタイマーが終了したことをわかりやすく知りたい。
◎貴方はタイマーが終了したことをわかりやすく知りたい。
◎貴方はタイマーの終了をわかりやすく知りたい
貴方はタイマーの終了をわかりやすく知りたい。
貴方はタイマーの終了をわかりやすく知りたい
◎貴方はタイマーの終了をわかりやすく知りたい
貴方はキッチンタイマーの終了をわかりやすく知りたい


◆スペイン語に翻訳
Desea saber que el temporizador ha terminado claramente.
◎ Desea saber que el temporizador ha terminado claramente.
◎ Quieres saber claramente el final del temporizador
Desea saber el final del cronómetro fácilmente.
Quieres saber el final del cronómetro fácilmente
◎ Quieres saber claramente el final del temporizador
Desea saber el final del temporizador de cocina fácilmente


◆再度、日本語からスペイン語に翻訳
タイマーがはっきりと終了したことを知りたい。
◎タイマーがはっきりと終了したことを知りたい。
◎タイマーの終了をはっきりと知りたい
ストップウォッチの終わりを簡単に知りたい。
ストップウォッチの終わりを簡単に知りたい
◎タイマーの終了をはっきりと知りたい
キッチンタイマーの終わりを簡単に知りたい


つまり何があったかというと

1.文の先頭に◎が付いているかどうかで何故かタイマーがストップウォッチになる。というかそれ以外も変わっている。タイマーは、キッチンタイマーに置き換えればきちんとそれで認識してくれる。

2.最後に【。】があるかどうかで、訳文が微妙に変わる。日本語にすると同じ意味になっているからあまり気にしても仕方がないのかもしれない。

3.二重主語の影響はあるように思える。『◎タイマーがはっきりと終了したことを知りたい。』と『◎タイマーの終了をはっきりと知りたい』では、後者の方が伝えたい文脈としては正しいように思える。

このようなことが起きました。
結構些細なことで影響を受けるもんだなと思いました。

あと、ふと今更であるが、google翻訳 注意事項
みたいな感じでググったら以下のサイトを見つけた。
個人的にとても為になったのでリンクを張らせていただきます。
まぁ、翻訳をしても本来の表現としては正しいかどうかはわからないよなぁ。
あと、大体の意味を知るのに使うならともかく、
きちんとした意味まで取るのは難しいのもそうだようなと思いました。

Google翻訳を使う時の注意点と質の良い文章についての考察


まぁ、それはそれとして逆翻訳はやったほうがいいとは思います。
タブレットを外国語に翻訳して日本語に戻したら薬という翻訳が起こった身としてはそう思わざる得ない。


なんか集中が続かないので今日はここまで

2017年11月16日木曜日

2017-11-16 到達点メモ


昨日の記事で、翻訳した内容を再度日本語に戻した方が良いと書いたが
それはそれとして、翻訳された内容をきちんと見たほうが良いということが分かった。

例:
日本語からインドネシア語に翻訳
日本語:タイマー時間一覧をタップして選ぶ
インドネシア語:Ketuk untuk memilih daftar waktu timer

翻訳したインドネシア語を日本語に翻訳
インドネシア語:Ketuk untuk memilih daftar waktu timer
日本語:タップしてタイマータイマーリストを選択する

あれ?翻訳したインドネシア語を日本語に翻訳した場合、日本語の意味がおかしい。となった方もいると思うが、冷静にインドネシア語を見ると、タイマータイマーの部分でそれぞれできちんと違う単語を使っている。

そういう意味では、一概に間違いとは言えないと思う。
ただし、私がインドネシア語に詳しいわけではないので結局日本語訳が正しいのかもしれないし、文字数は出来る限り減らした方がいいことを考えれば、似たような単語を連続して使わない方が賢明かもしれない。

Androidの公式ドキュメントによると、2017年11月9日時点でのAndroid5.0以降のバージョンの合計が79%になっていた。4.4を含めれば92.8%で、4.1.xまで含めれば98.1%までフォローできる。
今後を考えるとAndroid5.0でもかなりの数をフォローすることができ、4.4まで対応するれば、大体はフォローできそうではある。4.1.xまでやれば、ほぼ完ぺきといっていいだろう。


翻訳の設定疲れた。四か国同時にリリースとかやるべきではない。
一週間に一か国でも多いくらいかもしれない

Youtubeで字幕ファイルを作成していたら、アップロードした時に
字幕ファイル形式が不明ですというエラーが出て
かなり混乱した。
ファイル形式は、.sbvで拡張子もあっているはずだし、文字コードもアップロードできたファイルに中身をそのままコピーしてやってもできなかった。

原因は何だったかというと、中身の形式がYoutubeで想定されている形式でなかったためである。
何時も日本語の時間設定まで含めたデータを翻訳しているのだが
その際に、いつも余分な翻訳が起きてスペースが入ったり、句読点が変わったりするので
それに気が付かなくてファイルがアップロードできていなかった。
具体例は以下のとおりである。

◆翻訳前
0:00:00.000,0:00:02.700
VoiceTimerの使い方

◆翻訳後(英語)
0: 00: 00.000, 0: 00: 02.700
How to use VoiceTimer

◆アップロードできなかったファイルの例
0:00:00.000, 0:00:02.700
How to use VoiceTimer

,の後ろにスペースが入っているのに気が付かなくて
ずっと悩んでいた。

あと、今回翻訳していて気が付いたのだが
タブレット端末対応の事を「タブレット対応」と書かない方が良い
何故なら、薬と誤訳される可能性がある為。
スマートフォンタブレット対応だと、薬とは誤訳されなかった。

もう疲れたので今日はここまで。

2017年11月15日水曜日

2017-11-15 到達点メモ


昨日の続き

エミュレーターのAndroid8.0が動かない問題は
以下のサイトの通りにすれば動くことが確認できた

具体的にはSDK PlatformsのAndroid8.0とSDKToolのStatusがUpdateと表示されている部分を全部アップデートしたら動くことが確認できた。
*NDKは未だにupdateと表示されているのでNDKは関係なく、
恐らく、Build-ToolsやEmulatorやIntel x86 Emulator辺りが関係あると思われる。 

参考サイト:Android8.0 Oreo のエミュレータを起動する方法 | AVD Manager


で、Android8.0でインドネシアの国コードがidで動くかどうか確認したが
動かないことが確認できた。
Android8.1はまだ試していないが、こうなると仮にAndroid8.1で動いても
Android7.0、Android7.1.1、Android8.0で動かない事は確認できているうえに
inなら動くことが確認できているので、これ以上やってもしょうがないと思ったので8.1の方は検証していません。

ちょっと改めてインドネシア語のローケルについて調べてみたんですが
そもそもJavaでのローケルの文字がin_IDだったことを考えると
そんなに不自然でもないのかなと思いました。

参考サイト:サポートされているロケール

' を使う場合は、前に \ を入れることを忘れないようにすること
テキストで ' 以降の文が表示されない時は、\' になっていない可能性がある

一部の文字が入りきらない。
今回はそれっぽく誤魔化したが記号を採用するか
翻訳ごとに文字の大きさを変えるようにしないといけないかもしれない


グーグル翻訳を使っていて今更の話ではあるのだが
一度翻訳した内容はその翻訳した内容を日本語に戻して文意があっているかどうかを
確認したほうがいいかもしれない。

偶にではなくて時々ぐらいの頻度で翻訳文を日本語にさらに翻訳しなおすと本来の意味と違って見えることがあるので注意が必要である。

あと、自分も何度かやらかしたのだが改行コード(\n)を含めて翻訳すると
それも含めた意味で翻訳するようなので改行コードを含めないで翻訳したほうが良い。

なんか進みが悪いので今日はここまで


Androidでローカライズする際の注意纏め~設定編~


◆作業用リンク集
参考サイト:ネイティブスピーカーの数が多い言語の一覧
国別公用語一覧(一部の言語のみ対応)
国、言語別リーチ数一覧(非公開。自身の作業リンク用)
Androidでローカライズする際の注意纏め~文章編~


何かあれば追加します


◆インドネシア語
◎インドネシア語のISO 639-1は、idだが
Androidで設定する場合は、inでないと反応しない。

また、インドネシア語の切り替えができるようになるのは
Android7.0以降である

参考サイト:インドネシア語
参考サイト:Play Console ヘルプ-対応言語

◆その他

◎日本の実機だと、場合によっては英語と日本語しかローカライズの動作確認を行えない場合がある。少なくとも自身が持っているAQUOS-eaに関しては日本語と英語の二つだけである。

◎AndroidStudioのローカライズの設定をする際に、国コードであれば三文字のものでも
きちんと認識はする。(此処での認識とは、ファイルの左側に国旗マークが表示されることを指す。インドネシア語だと、in,id,ind全て認識した。)
ただし、Androidのローカライズ切り替え機能で反応するかは別の問題である。

◎ローカライズのテストはAndroid7.0以降で行った方が便利。何故かというと言語の検索機能と、選んだ言語を保存する機能があるから。

◎アプリを起動したままローカライズの変更を行う人は一定数いるようなので、ローカライズを行った際に、アプリが落ちないか、または、きちんと翻訳されるかどうかを動作確認したほうが良い。

2017年11月14日火曜日

2017-11-14 到達点メモ



デバック時にアプリのタイトルを変えたい場合は、
MainActivityのonCreateで条件分岐でsetTitleを使うのが一番簡単で確実ある。

はっきり言って、AndroidManifestで指定するのは色々魔境だし
結局のところ、ホーム画面でのアイコンの名前はそのままで、メニューバーの名前を変えるというやり方はわからなかった。
一応、調べた証として参考サイトを記録しておく

参考サイト:【Androidプログラミング入門 #018】ホーム画面やランチャーで表示されるアプリ名を変更する
参考サイト:How to set different label for launcher rather than activity title?
参考サイト:Launcher に表示されるアプリ名は intent-filter で設定する
参考サイト:Android アプリケーションのウィンドウタイトルを変更する


gradleでboolean型を使いたい場合は
以下のように指定する。
boolean型で指定するとエラーになるのでbool型で指定すること

    buildTypes {
        debug{
            resValue "bool", "debugFlag","true"
        }
        release {
            minifyEnabled false
            debuggable false
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            resValue "bool", "debugFlag","false"
        }
    }

また、Activityなどで呼び出す際には以下のように指定する

 if (applicationContext.resources.getBoolean(R.bool.debugFlag)){setTitle(R.string.debug_app_name)}


参考サイト:Cannot override bool resource using build.gradle on Android


それと、昨日の最後にインドネシアの国コードがidだと反応しない件について
書いたのだが、念のためもう一度検証した。
value-idと設定し、以下の画像の通りの設定である







しかし、Android5.0とAndroid5.1とAndroid6.0のエミュレーターでインドネシア語の切り替えの設定自体ができないことが分かった。
多分、インドネシアに出荷してあるAndroidはともかくとしてデフォルトでは対応していないという事なのだろうか?
ローカライズの情報をあさっているときに低いバージョンで自力でローカライズを切り替える話が出てくるがそういう事なのかもしれない。
アプリ自体で切り替える機能を入れると今のアプリのロジックだとめんどくさい事になりそう。

それはさておき、Android7.0、Android7.1.1でそれぞれ検証したのだが
やはりどれも表示されないことが分かった。
*Android8.0の方でも試してみたかったんだが、何度やってもエミュレーターが起動しない。昨日はいったい何だったんだろうか?

調べなおしてみたところ、公式ドキュメントの代替リソースを提供するの言語と地域によるとISO639-1の二文字の言語コードで定義し、オプションで二文字のISO3166-1-alpha-2(公式ドキュメントの方はリンクが切れているので、wikiの方を参考にすることした。alpha-2の項目を見るとよい)地域コードを後ろに追加することができるらしい。

ざっと、バグ報告を見てみたけど、一応前にも似たような問題は上がっているみたい。
……でも、これ(検証用のサンプルを作れ的な意味で)丁寧に書いてあげないとバグ報告が無視されそうな気がする。

メモとしてバグ報告の場所をリンクとして貼っておく

参考サイト:Play Console ヘルプ-対応言語
参考サイト:インドネシア語

テストしないのはまずい思ったので下記のサイトを参考にインストールをしているのだが、時間がかかりすぎているため今日はここまで

参考サイト:Android8.0 Oreo のエミュレータを起動する方法 | AVD Manager

2017年11月13日月曜日

2017‐11‐13 到達点メモ


グーグルスプレッドシート(Excelのグーグル版)の使い方メモ

sumif(範囲,条件,合計範囲)

範囲は、そのまま。条件を指定する際の基準の範囲
条件は、○○セルと一致するとかだったら、そのままC2という風に指定すればよい
合計範囲は、例えば英語のリーチ数の合計を求めたい時などに使う
範囲で言語名のセル範囲を指定し、合計範囲でリーチ数の範囲を指定すれば求めることができる

参考サイト:SUMIF(公式ドキュメント)


他のシートのデータを参照する場合
="シート名"!B2

この際に!を忘れないように注意。
この次のセル参照の固定で躓く時がある

参考サイト:他のシートのデータを参照する(公式ドキュメント)


セル参照の固定
セルの呼び出し先を固定した時に使う。
Excelと同じく$を使えばよいのだが
シート名で指定するときにうっかり以下のように指定してはいけな
"シート名"$!$B$2

表示が小さいため一見してアルファベットの l にしか見えない時がある
無論正しくは以下のように指定する
"シート名"!$B$2

参考サイト:spreadsheetでは、参照先の固定は出来ないで・・・


Adwordsで広告を打つ際に四種類のテキストで広告を打つことができるのだが
その際にどれくらいクリックされたかを見ることができる

1.個別のキャンペーンを選択。
2.左のメニューのキャンペーンをクリック広告アセット
3.キャンペーンと広告アセットの二つのタブがあるので、広告アセットをクリックする

そうすると、それぞれのクリック率を見ることができる。
また、変更前のキーワードも同時に見ることができる。

クリック率が低いのは、そこそこのクリック率のキーワードと1パーセント未満のキーワードが混じっている可能性があるのでそこの文章を新しく考え直した方が良いかも

グーグル対応言語表
https://support.google.com/googleplay/android-developer/table/4419860?hl=ja

他の言語に対応しようと作業していたのだが、
エミュレーターのAndroid8.0系がダウンロードできるのに気が付いて
その作業で大分手が止まっているので今日はここまで。

とりあえずちょっとだけメモ
まだ、きちんと確認できていないのだが
インドネシア語のidだと反応しなくて、inだと反応した件について
エミュレーターのAndroid8.0で確認
多分7.0系。Android8.0はsettingアイコンが7.0と違う上に
システム表示の項目が違ったので、おそらく見間違いだと思われる

2017年11月12日日曜日

Androidでローカライズする際の注意纏め~文章編~


◆作業用リンク集
参考サイト:ネイティブスピーカーの数が多い言語の一覧
国別公用語一覧(一部の言語のみ対応)
国、言語別リーチ数一覧(非公開。自身の作業リンク用)
Androidでローカライズする際の注意纏め~設定編~


おそらく日本人向けの内容。
なんか気が付いたら時々追加するかも。

◎主語を抜いた文章を作らない事

なぜなら、本来の意図ズレる可能性がある為。

駄目な例:タイマー終了時に音声でお知らせする
グーグル翻訳で英訳:We will inform you by voice when the timer expires

本来の主語は、タイマーもしくはアプリケーションなので
Weは趣旨としてはあっていないように思える

なので多分、こっちの方が文章としてはあっている気がする

多分先程よりは良い例:このタイマーは、タイマー終了時に音声でお知らせする
グーグル翻訳で英訳:This timer will be announced by voice at the end of the timer


◎グーグル翻訳する場合、文字で「・」を使わないようにする。

理由はいまいちわからないが、グーグル翻訳を使った場合
表示されない時がある

例:
【主な機能】
・タイマーの最大値は、99分59秒。
・値は各桁ごとに設定でき、各桁の最大値を超えると0になり、0を下回ると最大値になります。
・初期化ボタンでタイマーを00:00にすることができます。

英訳:
【Main function】
The maximum value of the timer is 99 minutes 59 seconds.
· The value can be set for each digit, it becomes 0 when it exceeds the maximum value of each digit, and becomes the maximum value when it goes below 0.
· The timer can be set to 00:00 with the initialization button.

見ての通り、英訳の2行目だけ『・』が削除されている。
全てを確認したわけではないが、ドイツ語、スペイン語、中国語(簡体)でも同様の現象を確認できた。
対策としては、◎を使う事をお勧めする。
英語、ドイツ語、スペイン語、フィリピン語(タガログ語)、フランス語、中国語(簡体)、ポルトガル語、ロシア語では問題は見られなかった。


◆主語を含まない場合、『~する』と『~します』は、(私の感覚では)ニュアンス的には大きな違いはないが翻訳すると文字数に大きく差が出る場合がある

GooglePlayStoreでアプリを公開する際に、使用できる文字数が制限される場合があります。
そのため、『~する』『~します』のそれぞれの意味の違いが重要で無いならば、
それぞれの訳された文章を見て文字数が少ないほうを採用したほうが良いと思われます。
主語を含んでいると、同じ文章として見られるみたいです。

例1(日本語と英語)

◎日本語
タイマー終了時に声でお知らせします
タイマー終了時に声でお知らせする
これはタイマー終了時に声でお知らせする
これはタイマー終了時に声でお知らせします
これはタイマー終了時に声でお知らせ

◎英語
We will inform you when the timer is over
Voice will be notified at the end of the timer
This will be announced by voice at the end of the timer
This will be announced by voice at the end of the timer
This is voice announced at the end of the timer


例2(日本語とタガログ語(フィリピン語))

◎日本語
タイマー終了時に声でお知らせします
タイマー終了時に声でお知らせする
これはタイマー終了時に声でお知らせする
これはタイマー終了時に声でお知らせします
これはタイマー終了時に声でお知らせ

◎タガログ語(フィリピン語)
Ipapaalam namin sa iyo kapag natapos na ang timer
Maabisuhan ang boses sa dulo ng timer
Ipapahayag ito sa pamamagitan ng boses sa dulo ng timer
Ipapahayag ito sa pamamagitan ng boses sa dulo ng timer
Ito ang boses na inihayag sa dulo ng timer


◆サイトによって言語名が違う

具体的にいうとフィリピン語、タガログ語、フィリピノ語である。
なお、厳密には違うらしいがほぼ同じ言語名である
Google翻訳だと、タガログ語で、
GooglePlayStoreだとフィリピノ語になり、
GoogleAdwordsだとフィリピン語になる。

同じ会社なんですから、名称の統一ぐらいしてもらえませんかねぇ……。
偶に本気で混乱するんですよ

参考サイト:フィリピン語
参考サイト:タガログ語



英語で調べる際の便利そうな単語リスト


備忘録用

◆~が動かない
don't work
doesn't work
not work

◆削除
remove

◆検知
detect

◆~の仕方
How to

◆~するにはどうすればいいのか?
How do I ~


参考サイト:ITエンジニアのための英語まとめ
参考サイト:Web関係の困り事を英語でググる時に知っておくと便利な単語やセンテンス


2017年11月11日土曜日

2017-11-11 到達点メモ


VoiceTimerで起きていたクラッシュログに出ていた問題の対策の続き

昨日の記事の一部抜粋

>>アプリを待機状態でローカライズの変更を行うのと
>>アプリを起動しないでローカライズを変更し、そのあとにアプリを立ち上げるのと
>>区別をつけることができていない。

ようやく何とか対策ができた。
最初は、onResumeとかonPause辺りで、プリファレンス辺りにデータを保存してその組み合わせで出来ないのかとか、バックキーを押したときにプリファレンス辺りにデータを保存してできないのか等を考えて実際試してみましたが駄目でした。

話から外れるが、Androidの三つのボタンの名称を忘れやすいのでここにメモしておく、
・ホームボタン
・戻るボタン
・メニュー・マルチタスクボタン
参考サイト:Androidの3つのボタン

検証した結果、ローケル変更を行うとアプリケーション自体にonCreateが呼び出されます。
その為、タスクから呼び出すのと、完全に終了したアプリを呼び出されるのに違いがほとんど無いようです。

今回は難しそうだったので検証はしていないのですが
調べたところ、リストから削除した方法を一応検知する方法があるみたいです。
具体的には、serviceを追加するとタスク一覧から指でスワイプして削除した場合
onTaskRemovedでそれを検知できるらしいです。

参考サイト:How to detect app removed from the recent list
参考サイト:Differentiate between Android killing the app and user swiping it off on the recent apps list

で、さんざん悩んだ結果ふと閃いたことがありまして。

Spinnerの表示元はString.xmlで宣言している内容を使っており、
Spinnerのオブジェクトの表示テキストの内容と本来の表示するべきString.xmlの内容が
一致していないことをうまく利用できるのではと思いついたので
試したところうまくいきました。

var res:Resources  = getResources()
var ta:TypedArray = res.obtainTypedArray(R.array.time_value_list)
if((paramsManager.locale_language == whenResume_local.language)||               (time_spinner.selectedItem.toString().equals(ta.getString(time_spinner.selectedItemId.toInt())))){
            Log.d(TAG,"onResume_finished")
        }else{
            Log.d(TAG,"ChangeLocale!!")
            restartFlag = true
            // アクティビティ終了
            this.finish()
}

こんな感じです。
まぁ、対処としてはどうなのよという思いはありますが
この方法だと変更箇所も多くないですし、
正直楽だったので……。
それにいつまでもクラッシュが発生する状態よりは良いかなと思っていたので
対処しました。

参考サイト:Android, arrays.xml で定義した配列を利用する
参考サイト:SpinnerとTextViewを用いたAndroidサンプルアプリ
参考サイト:スピナー (Spinner) で選択されたアイテムの取得

なんか一仕事した感があるので今日はここまで。

2017-11-10 到達点メモ


やっと、クラッシュログの内容が分かった。
前のバージョンから以下のようなクラッシュログが何度か出ていました。


java.lang.IllegalArgumentException:
  at com.aaa.nononaga.voicetimerr.MainActivity$onCreate$1.onItemSelected (MainActivity.kt)
  at android.widget.AdapterView.fireOnSelected (AdapterView.java:1319)
  at android.widget.AdapterView.dispatchOnItemSelected (AdapterView.java:1308)
  at android.widget.AdapterView.selectionChanged (AdapterView.java:1299)
  at android.widget.AdapterView.checkSelectionChanged (AdapterView.java:1480)
  at android.widget.AdapterView.handleDataChanged (AdapterView.java:1456)
(以下略)

ずっと何が原因で起こるかわからなかったのですが、ようやくアプリを起動中に
ローケルを切り替える(言語を切り替えると)と発生するのを確認しました。

もしかすると複数の公用言語を持っている国は、場合によって良く切り替えたりするのかもしれません。

前の記事にonItemSelectedにnullが入る時があるから
エラーが出るという話をしましたが

改めて調べなおしたところ、赤字の部分の引数が
nullが入る時があるらしいと分かりました
            override fun onItemSelected(parent: AdapterView<*>, view: View,
                                        position: Int, id: Long) {

ですので、結果としては以下のようにViewをNullable型に変えてやれば解決します
            override fun onItemSelected(parent: AdapterView<*>, view: View?,
                                        position: Int, id: Long) {

これでクラッシュは起こらなくなるのですが、問題があります。
それは、他の文字は新しい言語に翻訳されるのですが
このSpinnerだけ元の言語のままという問題が起こります。

参考サイト:KotlinでParameter specified as non-null is null

というか見直したら、通知のテキストも更新されてなかった。
で、試行錯誤した結果、ローケルを変えてアプを復帰した時に
アクティビティを立ち上げる命令を出した元のアクティビティを完全に終了させることで
完全に翻訳された状態にすることができました。

機能が少ないアプリなので再起動してもあまり時間がかからないので
この手段が使えますがロードするデータが多いゲーム系や
複雑なアプリだと起動時間が長くなるため、やばい気がします

◆現在のローケルの取得方法
Locale.getDefault().language
これで、現在何語かを取得することができる。

参考サイト:Androidアプリで現在選択されているロケールを取得する

◆ローケルが変更したことを確認する

ローケルが変更したことを認識するようなメソッドがあれば早かったのだが
どうも見つからなかったので別な手段をとった。
具体的にはアプリが復帰する際に、予め保存したデータと
現在のローケルを見比べるという方法をとった。

また、注意事項として完全にアプを終了しないで呼び出した場合でも
onCreateがよびだされているようなので
アプリの初回起動時と、アプから離れたときと
アプを復帰させた場合のそれぞれのケースを考慮して
書かないといけない。
具体的には、
・アプリの初回起動時、もしくはローケルの保存データがない場合は、現在のローケルを保存する
・アクティビティから離れた場合、現在のローケルを保存する
*もしかするといらないかも
・アクティビティから復帰した場合、現在のローケルと保存したデータを見比べて
違う場合ならアプリの再起動。一緒なら無視。また、変更後のローケルを保存する


◆アプリの完全に終了方法。

簡単にいうとSystem.exit(0)を使った。
書いた場所はonDestroyの一番最後
無論これが推奨されていないのは知っているが
finishとかだとどうも完全に終了できないようなので
また、公式ドキュメントを見た感じだと
そもそもアプリを終了させること自体に
余り好意的でないように感じる

参考サイト:アクティビティをシャットダウンする


ただ、現状だと何処かロジックに問題があるようで
アプリを待機状態でローカライズの変更を行うのと
アプリを起動しないでローカライズを変更し、そのあとにアプリを立ち上げるのと
区別をつけることができていない。

煮詰まった感があるので今日はここまで





2017年11月10日金曜日

Adwordsの広告でスタイルと表現というポリシー違反に引っ掛かった話。


今、複数の言語で広告を出しているのですが
今日、メールで以下のようなものをもらいました


(前略)
平素より AdWords をご利用いただき誠にありがとうございます。

お客様の一部のユニバーサル アプリ キャンペーンでポリシー違反が見つかりました。この違反はキャンペーンの掲載結果に影響している可能性がございます。以下のレポートで詳細をご確認のうえ、記載されたリンクからポリシーに関する説明をご覧ください。


----------------------------------------------
キャンペーン: 「VoiceTimer#英語」
自分の広告のURL
----------------------------------------------

- スタイルと表現
  https://support.google.com/adwordspolicy/answer/6021546?&hl=ja#327
---------------------
(以下省略)

で、困ったことに実際のサイトに行ってみても
最初はどれが原因なのかいまいちわかりませんでした。

何故かというと、宣伝をする際に四種類のテキストが指定できるのですが
そのうちのどのテキストがおかしいのかの指摘がなかったためです。

四種類のテキストのうち一つのテキストは無理やりな文章だと自分でも思っていたので
それを修正したのですがエラーマークが消えませんでした。

そこでGooglePlayストアの英語の説明文をじっくり見直したところ
どうも説明文に使っていない単語を使ったため
エラーが出たようでした。

具体的にいうと、Simple and Easy Useみたいなテキストにしていたのですが
説明文にSimpleという単語はどこにも使っていなかったのです。

で、テキスト文を説明文にある単語で書き直したところ、
エラーマークが無事消えました。

AdWordsのテキストは25文字に抑えるのがきつく、割と雑に作っていたので
もう一度見直す必要がありそうです。

2017年11月7日火曜日

2017-11-07 到達点メモ


忘れやすいのでメモ
gimpでオブジェクトの整列を行いたい場合は
赤枠で囲んだ部分をクリックし


基準をアクティブなレイヤーに変更し



レイヤーで基準にしたいレイヤーを選択した後に、
並び替えたい整列ボタンをクリックする


googleConsoleの方を見たら、クラッシュの報告が来ているのを確認したので
テストをしてみたのですが、どうも再現できない。
一応、エラー文をそのまま検索をかけたところそれっぽいのは見つかったのですが……
参考サイト:Kotlin crashes on Android when selected item view is null
によると、AdapterView.OnItemSelectedListenerの中で宣言したonItemSelected()
の引数が、nullを取得する時があるらしい。
……まじかよ。
参考サイト:43.2.15 その他の例外のjava.lang.IllegalArgumentExceptionの項目部分
多分、上記の参考サイトと合わせて考えるに
nullが入っていることは案外ありそうだなと思った。

で、そういう訳で自動テストの方を試してみたいと思って
メモをしていなかったので忘れていたのだが
FirebaseにTestLabがあるので、それを使えばよい。

また、色々あってFirebaseがきちんと組み込んでいなかったので
組み込もうとしたら以下のようなエラーが出た

Error:Execution failed for task ':app:processDebugGoogleServices'.
> Please fix the version conflict either by updating the version of the google-services plugin (information about the latest version is available at https://bintray.com/android/android-tools/com.google.gms.google-services/) or updating the version of com.google.android.gms to 9.0.0.

困ったので検索したところ
以下のページを見つけた。
参考サイト:AndroidでGoogle Play 開発者サービス 8.4.0を導入したらversion conflictが起きた


どうも  apply plugin: 'com.google.gms.google-services'は
   compile 'com.google.android.gms:play-services-ads:11.0.4'を呼び出した後に
書かないとエラーが出るようである。


そして、どうしても減少が再現できないので変な動作をしていたら
新たなバグを発見してしまった……。
具体的にいうとバックキーを押すと、アプリが終了するのだが
その際にタイマーが働いていると、前のタイマーの時間が保持された状態なので
新しくタイマーを動かすと、前のタイマーと新しいタイマーが
同時に動き、表示がおかしくなります。
バックキーで終了的な事は基本は自分はしないのですが
他の人がこのような動作をする可能性はあり得るので、直します。

で、色々調べた結果、まずバックキーを検知する方法は

    override fun onBackPressed() {

    }
で、行うことができました。

一方で、原因は完全にわかり切っているわけではないのですが
    override fun onBackPressed() {
        super.onBackPressed()
        Log.d(TAG,"Pressed_BackKey")
        moveTaskToBack(true)
    }
にすると、super.onBackPressed()以降の文が全部無視されるので書かないようにしましょう。
どうも、参考サイトによると、super.onBackPressed()でデフォルトの動作を行っているようで、それがアクティビティを終了させる動作だから、そこで処理が止まってしまって以下の動作が無視されたのかもしません。

参考サイト:Android Overriding onBackPressed()


同時並行で終了させる方法も調べていたのですが、
finishAndRemoveTask()でバックタスクを残さずに
終了させることができるのですが
この場合、どうも全部の内容を削除しているわけではないようで
具体的には、バックキーを押したときと同様の現象が発生します。

参考サイト:Activity#finish() でアプリが終了できないときは
参考サイト:公式ドキュメント-オーバービュー画面-AppTask クラスを使用してタスクを削除す
参考サイト:公式ドキュメント-タスクとバックスタック


応急処置的な手法であれなのですが、
バックキーを押したときに、バックタスクにするという風な仕様にすることにしました。
と言っても最初はバックキーを押したときにバックタスクに残っていたこともあり、こっちの方がある意味操作感が変わらなくていいかもしれない。

具体的には以下のように書きます。
    override fun onBackPressed() {
        moveTaskToBack(true)
    }

参考サイト:Android で System.exit() を使ってはいけない理由と、終了方法のまとめ

ザっと動作確認をした限りでは、大丈夫そうなので
明日また確認したらアプリを上げる予定です。

今日はここまで。


2017年11月6日月曜日

2017-11-05~06 到達点メモ


久しぶりに画像の加工をやったら、動作を忘れていたのでメモ
gimpでオブジェクトを整列させたい場合は、以下のとおりにやること
https://docs.gimp.org/ja/gimp-tool-align.html


Androidアプリを公開した後に追加実装をしたい場合に真っ先にやっておいた方がいい事として、Gradleのアプリのバージョンコードを上げておくこと

何故かというと、GooglePlayに上げてあるバージョンのコードだと
実装のテスト中にクラッシュした場合
GooglePlayConsoleに報告が行くからです。

一人のクラッシュ数が掲載順位とかにそんなに影響はしないとは思うのですが
気分が悪いですし、一瞬勘違いするし、紛らわしいので
テストをしたい場合は、バージョンコードを上げておきましょう

今回、対応でフィリピン語を追加した際に、混乱したので載せておきますが
グーグル翻訳、Youtubeだとタガログ語
GooglePlayConsoleだとフィリピノ語
Adwordsだと、フィリピン語になります。

ネットに繋がっていると、問答無用で全部報告が行くみたいです。

adwordsで広告を打つために公用語一覧を作っていたのだが
複数の公用語がある場合があるので場合分けとかが面倒である。

今回データをグーグルスプレッドシートの方で立ち上げたのだが
iframeの方だとどうも、フィルターが効かないようである

埋め込む際に参考にしたサイト:GoogleスプレッドシートをBloggerに埋め込む(練習)

参考サイト:ネイティブスピーカーの数が多い言語の一覧

現状で対応しているのは、ドイツ語、フランス語、スペイン語、ポルトガル語のみです。




自分としては、わざわざエクセルを立ち上げなくても
アクセスできるようにしたいのでこうしたのだが、いまいち目的にあっていない
リンクを張るぐらいでしょうか?

国別公用語一覧

……編集者以外はフィルターが掛かっていないのでダメみたいですね。
ただ、閲覧者でもフィルターは作れるので(その際に見ている人のみがフィルターにかかった状態になっている)
見るたびにフィルターを作って並べ替えたり抜き出したりするといいでしょう。

あと、自分はフィルターをかける際に分からなくて悩んだので載せておきますが、
例えば、スペイン語だけをフィルターでかけたい場合
スペイン語以外の選択を解除して、値でフィルターをかけるの横にある
右向き横三角マークをクリックすると、OKボタンが表示されるので
そこでOKを押すと、フィルターが掛かります。

宣伝用の画像とか、色々やろうと思ったのですが
遅くなったので今日はここまで。

2017年11月4日土曜日

2017-11-04 到達点メモ


*kotlinで書いてます

VoiceTimerの新たな機能として音量調整を機能を作っていたのだが
意外に面倒。

よくあるシークバーによる音量調整機能をつけようと思ったのだが
調べたところ、一先ず公式ドキュメントにSeekBarPreferenceというのがあるのを見つけた。

途中で詰まったのでほおっておいたのだが、調べなおしたところ
普通にxml上で<android.support.v7.preference.SeekBarPreference/>
という風に使えば使えそうである。
明日辺り試す。

参考サイト:Styling android.support.v7.preference.SeekBarPreference

で、今回自分が試したのは
MaterialSeekBarPreferenceというライブラリである。

サンプルだけだとどうにも理解できなかったため
大分悩んだのですが、こう書きました

xmlファイル
<?xml version="1.0" encoding="UTF-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.pavelsikun.seekbarpreference.SeekBarPreference
        android:key="@string/key_name"
        android:title="@string/pref_title"
        app:msbp_interval="1"
        app:msbp_maxValue="100"
        app:msbp_minValue="0"
        app:msbp_measurementUnit="%"
        app:msbp_dialogEnabled="false"
        />

</PreferenceScreen>

kt.ファイル

class SettingPreferences : PreferenceFragment(), SharedPreferences.OnSharedPreferenceChangeListener {
//中略
        val volumeAdjustment = findPreference(seekBarKey)
        volumeAdjustment.onPreferenceChangeListener = Preference.OnPreferenceChangeListener { preference, any ->
            val volume_persent = any as Int
            //処理内容
          false
        }
        volumeAdjustment.setDefaultValue(default_value)
//以下略

簡単に解説するとSeekBarPreferenceに型変換をする必要はなく
findPreferenceでとってくることができます
値が変化した時に値を保存するなり好きに処理すればいいと思います
デフォルト値は、setDefaultValueで代入できます。

ひとまず7.0で動作することが確認できたので
今日はここまで。

2017年11月3日金曜日

2017-11-02 到達点メモ


昨日の続き
よく見たら、昨日の記事にVoiceTimerをKotlin化するとか書いていないが
昨日からそれの作業をしている。

おそらくkotlinに変換した場合が原因だと思われるのだが
どうもcontextとは予約語の一部として採用されている節がある。
kotlinは、get/setを使わないで全部変数で採用する部分があったので
その影響を受けている節がある
単に、変数として使っているだけなら、名前は変えたほうが良い

具体的には、以下のような注釈が付く
Call requires API level 23 (current min is 21): android.app.Fragment#getContext less... (Ctrl+F1)
This check scans through all the Android API calls in the application and warns about any calls that are not available on all versions targeted by this application (according to its minimum SDK attribute in the manifest).  If you really want to use this API and don't need to support older devices just set the minSdkVersion in your build.gradle or AndroidManifest.xml files.  If your code is deliberately accessing newer APIs, and you have ensured (e.g. with conditional execution) that this code will only ever be called on a supported platform, then you can annotate your class or method with the @TargetApi annotation specifying the local minimum SDK to apply, such as @TargetApi(11), such that this check considers 11 rather than your manifest file's minimum SDK as the required API level.  If you are deliberately setting android: attributes in style definitions, make sure you place this in a values-vNN folder in order to avoid running into runtime conflicts on certain devices where manufacturers have added custom attributes whose ids conflict with the new ones on later platforms.  Similarly, you can use tools:targetApi="11" in an XML file to indicate that the element will only be inflated in an adequate context.

あと、注意事項として、Record Espresso Testを行う場合、
自動生成されるのがjavaファイルなので気を付ける事

ただし、単純にktファイルに変換しても動かないようである
ちょっと調べてみたが、いまいち原因が掴めないため
テストコードだけはjavaで書いた方が楽かも

あと、kotlinでは、イテレーターが使えるため
for(i in 1..9)のような書き方ができる。
これが使えると本当に便利。

あと、下記のようなエラーが出た場合、Rebulidして再度Runをすれば動く

java.lang.RuntimeException: Unable to instantiate application com.aaa.nononaga.voicetimerr.ClassNoticeManager: java.lang.ClassNotFoundException: Didn't find class "com.aaa.nononaga.voicetimerr.ClassNoticeManager" on path: DexPathList[[zip file "/data/app/com.aaa.nononaga.voicetimerr-2/base.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_dependencies_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_0_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_1_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_2_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_3_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_4_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_5_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_6_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_7_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_8_apk.apk", zip file "/data/app/com.aaa.nononaga.voicetimerr-2/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.aaa.nononaga.voicetimerr-2/lib/arm, /system/lib, /vendor/lib]]

ひとまず、VoiceTimerが一通り動くことは確認できたので今日はここまで

2017年11月2日木曜日

2017-11-01 到達点メモ


*Windows環境での話です

KotlinはAndroidStudio3.0ではデフォルトで入っているはずなのでそこはスルーする

javaフォルダをクリックして、Ctrl + Alt + Shift + Kを同時押しするか
上のメニューバーからCode → Convert Java File to Kotlin File(自分の環境下では一番下にあった。また、変換していると灰色になって選択できない状態になっている)

参考サイト:Kotlin導入
参考サイト:【Android】AndroidのJavaコードをKotlinに変換する

次はプラグインを入れる。これを入れて設定するとわざわざレイアウトファイルでIDを設定すれば、そのまま使えるようになる

Gradleのappの方に、以下の一文を追加する
apply plugin: 'kotlin-android-extensions'
その後同期をしたあとに、各Activityごとに、import kotlinx.android.synthetic.main.activity_main(レイアウト名).*
を書けばよい

参考サイト:Kotlin Android Extensions


変換した際に注意すること

・メソッド名でget~やset~のどちらかを頭にメソッド名としてつけていると
自動的に置き換えられてしまうので注意すること。


*getの場合
変換前:timerNumber.getTimerSec()
変換後:timerNumber!!.timerSec

*setの場合
変換前:timerNumber.setTimerSec(now_sec)//getTimerSec() =
変換後:timerNumber.timerSec = now_sec


・クラスメンバー変数で特に値の代入をしていないと、全部自動的にnullableに置き換えられてしまうので、手動でlateintに置き換えてやる必要がある


今日はここまで。