【Android日誌】2016_02_01週_Invalid Gradle JDK configuration found他

コーディング以外にも調べる機会があったのでアウトプットしていきます。

ディープリンクとは

Topページ以外のページへのリンクのこと。元々はWebサイトについての言葉だが、アプリに対しても使う。 アプリをインストールしているユーザーだった場合は、アプリの該当画面(詳細画面など)に遷移する方法。 インテントフィルターで受け取る方法などの公式。

https://developers.google.com/app-indexing/android/app?hl=jadevelopers.google.com

AppIndex

developers.google.com

検索結果画面からアプリに飛ばされるアレ。Rettyとかよく飛ばされるイメージだけど、結構使いづらくてあまり印象よくない。

アンバンドリング

複数機能を持ったアプリを1アプリ1機能に分割すること。最近のトレンドらしい。 facebookメッセンジャーなどが代表的な例みたい。元々はアプリ都合の部分もあったみたいだが、アプリは何かの目的別のもの、と見ると機能(目的)ごとに分割するのは合理的なのかもしれない。 www.gizmodo.jp newspicks.com

Android Studioの設定ファイルimport

  • File>import Settings で設定ファイルを読み込めるし、Export Settingsで吐き出すこともできる

qiita.com

Invalid Gradle JDK configuration found?

  • チームで使われていた設定ファイルをimportしてからか?のタイミングでgradleが走らなくなった。

stackoverflow.com

JDK Locationのjdkのverがローカルにあるのがjdk1.8.0_51だったが、プロジェクトに設定してあるのはjdk1.8.0_31だった。1.8は一緒だったため、なかなかきづけなかった。

At first update your java. Then check your JDK version. for example: jdk1.8.0_51. Then go to android studio and then go to File ---->Project Structure----> JDK Location (If you install update version of JDK, android studio JDK Location hold older versions jdk url.For example: C:\Program Files\Java\jdk1.8.0_45).

Android Studioのアップデート

Updateする時、こんな警告が出て、Updateできなかった問題が発生。 f:id:chiiia12:20160215010241p:plain

qiita.com この記事を参考にしていて以下のファイルを触ったことが問題みたい。

/Applications/Android Studio.app/Contents/plugins/android/lib/templates/gradle-projects/NewAndroidProject/root/project_ignore

消すだけじゃダメ、空ファイルでもダメみたい? 結局初期のファイルのままを置いてやるとやっと大丈夫に。 solutionの欄がNONEがなくなれば、proceedのボタンが出現し、無事updateが進む。

vim系のtips

DDMSとは

端末を一意に取得するID

広告配信系のサービスを導入する時に話題に。 リタゲのようなことをして他アプリに広告を配信するには端末を一意に取得していないと出せないよね、と。 どういう値を取得しているんだろう?というお話。

http://iridge.jp/blog/201404/4836/iridge.jp

GSM端末とCDMA端末の違い

www.mobistar.jp

IMEI とは

なんとなく、ネットワーク制限などもできるとするとこれを取得するのはかなり強いな、というイメージ。 悪用とかもできちゃう?のかな。個人情報とされるのか、みたいのが問題になる可能性があるみたい。 kaoru0822.seesaa.net

advertisingId とは

名前からもわかるように広告用の匿名性を保った上で端末を一意に判別するIDみたい。 tech.admax.ninja

【Android日誌】2016_01_25週:どこまでnullチェックすればいいのか他

shouldOverrideUrlLoading()はpostだと呼ばれないよ

webViewのページ読み込み時にURLを割り込みできる関数だが、

/**
     * Give the host application a chance to take over the control when a new
     * url is about to be loaded in the current WebView. If WebViewClient is not
     * provided, by default WebView will ask Activity Manager to choose the
     * proper handler for the url. If WebViewClient is provided, return true
     * means the host application handles the url, while return false means the
     * current WebView handles the url.
     * This method is not called for requests using the POST "method".
     *
     * @param view The WebView that is initiating the callback.
     * @param url The url to be loaded.
     * @return True if the host application wants to leave the current WebView
     *         and handle the url itself, otherwise return false.
     */

と書いてある通り、postだとこの関数は呼ばれない。

WebView form - POST をインターセプト-Oboe吹きプログラマの黙示録

じゃあどうするのかと、jsで埋め込んでなんとかする方法がちらほら…。 ここまで対応すべきかどうかどうかは不明。

どこまでnullチェックすればいいのか?

自分の中で、いまいちこのへんの感覚がわからなかったので、調査。 呼んでくるメソッドがnullを返さないことがわかっていれば、もちろんnullチェックをしなくていいけど、 onDestory()が呼ばれた後に通信のコールバックが返ってくる時とかは、nullになることがあるし…。 アプリを触りながらそういうところをチェックするのではなく、ソースの中でロジックで考えるように心がけようと思った。

d.hatena.ne.jp

webView読み込み途中でのクラッシュ

05:27:57.165    799-14680/? W/ActivityManager﹕ Process jp.co.hoge.hogeapp has crashed too many times: killing!
01-29 05:27:57.165    799-14680/? W/ActivityManager﹕ Force finishing activity hogehoge

webViewにてページの読込中の際に読み込み途中のページのボタンをタップすると落ちることはある。 RuntimeErrorではないからエラーログなどは取れない代わりにこのようなログアリ。

いくつもスレッドが走ることで落ちるものなのかな、と思いつつ根本的な解決が不明。

  • 読み込みが終わるまでwebViewをINVISIBLEにしておく

これで対応するしかないのかもしれない…。

www.swingingblue.net

www.swingingblue.net

Android Javaでフィールドにプレフィックスをつけるのはやめようの理由

今週話題になった記事について結局なんでこんなこと言ってるの?がわからなかった。

gfx.hatenablog.com

  • 昔のテキストエディタは精度が悪かったため、今みたいにメンバ変数に色とかつけてくれなかった
  • 昔のCの名残りなど
  • 今はIDEなどが発達してきて色などをつけてくれるから、プレフィックスが必要なくなったと考える

みたい!

【Android日誌】2016_01_18週:WebViewのキャッシュモード他

webViewのヒストリーバック時にERR_CACHE_MISS

ブラウザでも同じ挙動になるが、入力→確認→完了画面といった遷移でポストで情報を受け渡ししているとき、historyバックするとERR_CACHE_MISSというエラーになってonReceivedErrorに入ってしまう。今回担当の要件は、onReceivedErrorではネットワークエラーに入るものとして使用していたので、ちょっとおかしなことになる(ネットワークはあるのに、通信エラーとしてダイアログが出る、など)

stackoverflow.com

sdk19以降の挙動とかどこで見ればいいんだろう

http://developer.android.com/intl/ja/reference/android/webkit/WebSettings.htmldeveloper.android.com

webViewの設定setCacheMode

webViewのWebSettingにはキャッシュモードが選択できる。 キャッシュについては奥深そう・・・ http://dayafterneet.blogspot.jp/2011/08/androidwebview_23.htmldayafterneet.blogspot.jp

SDKバージョンとOSバージョン

リファレンスではSDKバージョンで説明してあることが多いのでここの対応関係は頭に入れておきたい。 結構OSバージョンで考えていることが多い。

AndroidのバージョンとAPIレベルの対応関係

WebView内のiframeについて

4.2以下の端末ではwebView内のiframeリンクタップ時にshouldOverrideUrlLoadingが呼ばれない。

sakura-bird1.hatenablog.com

何回もこの記事見てたけど、このことだったのか、と再実感。 ぶち当たる前に頭に入れておけたらいいのになぁ… qiita.com

Logを適切に使う

www.javadrive.jp

Fragmentの"java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState"

絶妙なタイミングでactivityが破棄されるとこの例外でアプリが落ちる可能性あり。

qiita.com

DialogFragmentのshowの中をどうカスタマイズするか http://kokufu.blogspot.jp/2014/08/onactivityresult-dialogfragmentshow.htmlkokufu.blogspot.jp

プロジェクトによってはtry,catchで囲んで握りつぶしているところもあったので、どういう対処が賢いのかちょっとわからない。

onReceivedErrorが複数回呼ばれる

弱電界から読み込み途中の際に圏外になった場合に発生(4.2以下でっぽい) そのうち、historyに何個も積まれるので、そのあとbackキー押しても同じページをloadするばかりで困る

アプリのcacheには何が入ってるのか

http://blog.livedoor.jp/an_square/archives/51803192.htmlblog.livedoor.jp

ブラウザのキャッシュもアプリのキャッシュに含まれるみたい。 他にはtempファイルも含まれるみたい。

http://computerexpert.web.fc2.com/android/recipe10-4.htmlcomputerexpert.web.fc2.com

API通信で一度読み込んだページはCacheしておいて、二度目の来訪にはキャッシュを使うなど、で自分でもCacheに保存できるみたい。 ブラウザは元々キャッシュ取ってるからwebViewでも知らぬ間にキャッシュを取っているんだろうな。

webViewのpostで遷移してきたページを戻す

LOAD_NO_CACHE

にwebVIewの設定をしたけど、スタックはしないが、結局アプリ内のキャッシュを見に行ってしまっていた キャッシュを消せばすべてインターネットから取得してくるようになって、最初から画面が読み込まれるようになった

ifの条件式の書き方

if文の条件式の書き方でレビューをもらった。

        @DebugLog
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (mHogePresenter != null
                    && mHogePresenter.shouldOverrideUrlLoading(url)) {
                return true;
            } else {
                return super.shouldOverrideUrlLoading(view, url);
            }
        }

考えかた

  • 独自でハンドルする部分は、独自でハンドルする条件で条件を書く
  • それ以外はsuperに任せる
        @DebugLog
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (mDandoriWebViewPresenter == null) {
                return false;
            } 
                return mDandoriWebViewPresenter.shouldOverrideUrlLoading(url)
                        || super.shouldOverrideUrlLoading(view, url);
            
        }

イレギュラーなケースを先に持ってきて、後で正常な動きをする思想のときはこの書き方。 nullの時は例外としてfalseを返す、それ以外はまず独自でハンドルする、その方法じゃないと返ってきた時はsuperにお願いする。

     @DebugLog
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (mDandoriWebViewPresenter == null) {
                return super.shouldOverrideUrlLoading(view, url);
            } else {
                return mDandoriWebViewPresenter.shouldOverrideUrlLoading(url);
            }
        }

これはあんまりよくない例で、nullチェックとsuperを呼ぶことに繋がりがない。

dev.classmethod.jp

google +1の挙動

webViewのテストをしている時に+1の正しい挙動がわからなかったので、メモ。 webViewの中からgoogle+1を押下すると正しく動かない(6.0ですらブラウザに飛ばされて閉じられるだけで動かない) www.actzero.jp

4.2.2でWebViewのキャッシュクリアが効かない問題

 // 4.4以降のヒストリーバック時のERR_CACHE_MISS・4.2以前のwebback後の遷移できない不具合をふせぐための設定
        mHogeWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

でこのように設定していたが、4.2(.2)に関してはキャッシュが残ってしまうみたい。

stackoverflow.com

stackoverflow.com

        @DebugLog
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            /*
             * OSVer:4.2.2のみ
             * setCacheMode(WebSettings.LOAD_NO_CACHE)
             * を設定しても、キャッシュを保存してしまうためページを読み込む前に明示的にキャッシュをクリアしています。
             */
            view.clearCache(false);
            if (mHogePresenter != null
                    && mHogePresenter.shouldOverrideUrlLoading(url)) {
                return true;
            } else {
                return super.shouldOverrideUrlLoading(view, url);
            }
        }

onPageFinished()onPageStarted()で呼ぶとキャッシュから読み込んでしまう間にキャッシュを切るので画像などが読み込めずに終わるため、ページを読み込む前のshouldOverrideUrlLoading()に追加することにした。

Androidその他

Togglを使ってみる

時間管理の話で、Togglというサービスを見つけたので、現在使ってみている。 一旦は一日で実装の時間がどれくらいあって、それ以外の時間がどれくらいあるのか?を可視化してみるため。

shoma2da.hatenablog.com

英語読むの辛い時の情報収集

Forkwell Press – 「煽って盛り上げるのは“自分がその技術を使いたいから”なんです」-Increments...

ですので、先ほど挙げた「Hacker News」や、JS版のHacker Newsのような「Echo JS」といったサイトで、まずは見出しを中心に目を通すようにしています。「最近、この単語が見出しによく出ているのに、自分は手を付けていないな」と感じた時に、きちんと調べ出すといった感じですね。

英語読めないし読んでも頭に入らないのに読んだほうがいいって言われても・・・と思っていたので、こういうのは勇気づけられる。

2016_01_12週_子要素のstateに合わせてstyleを変える他

子要素のstateに合わせてstyleを変える

子要素にcheckboxが入っているlinearLayoutとかで、子要素のcheckedに合わせて親のlinearlayoutもstyleを変えたい時

LinearLayout
    CheckBox

こういう状態で、CheckBoxのcheckedの状態によってLinearLayoutのスタイルを変える

android:addStatesFromChildren="true"

これをLinearLayoutにつけて、いつものselectorを設定すれば、子要素のcheckboxのcheckedを取得してきて見た目を変えることができる。便利〜。コードがすっきりする〜

WebViewClient#shouldOverrideUrlLoadingとは何者

onPageStartedの前に呼ばれる url見てwebView内の挙動にしたくない時などに使える ※今回は外部サイトなので、外部ブラウザに飛ばす時に使用

d.hatena.ne.jp

resourceでstring-arrayを持つ

  <string-array name="url_patterns">
        <item>hoge.jp</item>
        <item>hoge.hoge.jp</item>
        <item>hoge.fuga.net</item>
  </string-array>

呼び方は

context.getResources().getStringArray(R.array.url_patterns);

簡単。

OkHttp3リリースについて

qiita.com

  • パッケージ名が2系と異なるため既存のものと一緒に使える
  • 2.4はデフォルトタイムアウト設定されてない
  • 2.5はデフォルトタイムアウトが15秒設定されている

TextViewのデフォルトカラー

コードから文字色を変える時

hogeView.setTextColor(R.color.res);

という風にはかけない

stackoverflow.com

memo755.blog.fc2.com

stackoverflow.com

webViewのreload

postで送られた画面などはreload()では機能しない。 loadUrl()を用いてreloadを実装する

stackoverflow.com

引数の中身を変える

 @Override
    public void showHoge(String url) {
        if (TextUtils.isEmpty(url)) {
            url = getResources().getString(R.string.webview_http);
        }
       ・
  ・
  ・

    }

基本渡ってきた引数を使うけど、空だったらとかイレギュラーな値だったら特定のものを入れたい、とか 新しく変数つくらなきゃいけないと思ってたけどこれでいいんだ、知らなかった…

暗黙的インテントでActivityNotFoundException

外部アプリにインテント投げるときに、該当のアプリがない場合はActivityNotFoundExceptionが起きる

9ensan.com

return を||で返す選択肢

return hogePresnter.shouldOverrideUrlLoading(url)|| super.shouldOverrideUrlLoading(view, url);

2016_01_05週_Parcelable内のwriteとreadの順番他

毎日メモはしてるので土日にまとめて公開することにします。 一週間経つだけでも全然忘れてしまうな…。ブログに公開することで、自分が目に通す回数を増やしたりできればいいな。 良い復習にはなりそう。

JVMJREの違い

聞かれてわからなかった・・・

http://www.mltlab.com/wp/archives/406www.mltlab.com

Dalvikとは

e-words.jp

http://www.wdic.org/w/TECH/Dalvikwww.wdic.org

WebViewのonReceivedErrorが呼ばれない

API 23ではonReceivedErrorの仕様が変わったそう。 でも新しいonReceivedErrorだとネットワークエラー時に呼ばれない。

complieSdkVersionを23にすると非推奨の打ち消し線が入るのでなんでこうなっているのかわからなかった

何が原因なんだろうか、なにかのverな気がする… 結局compileSdkVersionを22に下げても、6.0端末で試してもこの新しいonReceivedErrorは呼ばれなかった

LinearLayoutでparentBottomを表現する

http://ichitcltk.hustle.ne.jp/gudon2/index.php?pageType=file&id=Android055_layout4ichitcltk.hustle.ne.jp

特定のコミットからブランチを切る

qiita.com

デフォルトのDialogを使うのがよくない理由

numalog.relva.org

getFragmentManagerとgetSupportFragmentManager

 getSupportFragmentManager().executePendingTransactions();
        if (getSupportFragmentManager().findFragmentByTag(DatePickerDialogFragment.TAG) != null) {
            return;
        }
        DatePickerDialogFragment.newInstance().show(getSupportFragmentManager(),
                DatePickerDialogFragment.TAG);
                

ダイアログの二重起動での制御について、 findFragmentByTag()がいつもnullで帰ってきてしまう問題。

今回はsupportのDialogFragmentを使ってるので、FragmentManagerを呼ぶ時はサポートの方で呼ばなくては返ってくるFragmentManagerが異なる。

getFragmentManager()getSupportFragmentManager()も呼べるため、なぜ合っていないのか気づきにくかった.

supportlibraryを使ってるのかそうでないのかみたいなところが意外と時間を食われる元な経験が最近多い…

stackoverflow.com

stackoverflow.com

久しぶりにgitでミスった

最近revertとかresetなど多用していてdiffがすごいことになった死にたい

masterとheadのdiffを一覧で見る

git diff master..head --stat

一度pushした後にローカルでresetしたりするとnon-fast-forwardで怒られる

git push origin :hoge

で空をremoteのhogeブランチにプッシュすることになるので、リモートのブランチが消える

git push origin hoge

でもう一度pushすればいい

特定のファイルだけmergeする

qiita.com

文字列のちょっと凝った操作

意外とよく使うけどすぐ忘れちゃう

http://y-anz-m.blogspot.jp/2011/03/android-xml.htmly-anz-m.blogspot.jp

どのタイミングで状態が変わるのかコメントに付け足しておく

void hoge(){
if(mDisable){
    return
}
mDisable = true;
・
・
・

のようなインスタンスフィールドのboolean値などはなるべくインスタンスフィールドに持たない方がよいと言われてるくらいだから、 どの状態で変わるのかはコメントしておいたほうがあとで見た人(自分も含む)が理解しやすそう。

今回は親のクラスで使われている変数だったため、なおさら。

license情報

vividcode.hatenablog.com

  • リリース用のものだけでOK(リリース用apkに含まれるもののみ)
  • テスト用・デバッグ時にしか使ってないもの(loggingのものなど)は表示しなくてよい

AndroidManifest Activityの設定

http://docs.monaca.mobi/cur/ja/reference/reference/config/android_configuration/#manifest-xmldocs.monaca.mobi

自動でlabelがついてくるけど、特になくてもよさそう。ある場合は、lancherの時アプリ名として表示される。 なかったらデフォルトのものが表示される。

Acitivityのデフォルトに入っている値を利用する

知らなかったけど結構、元々用意されているものが多い。自分で定数設定しなくて済むので、いろいろ書き留めておきたい。

ActivityのRESULT_OK ex)Activity.RESULT_OK

MVP設計におけるDtoを持つ場所

Activityにインナークラスで次画面に渡すためのインナークラスを持っていたところ、インターフェースに持つよう指摘された

理由としては、Activity / Fragment に関係なく、View に固有する dto であれば、View のインターフェースの定義するのが望ましいからです。

どこに依存している情報なのか?を考える。

strings内のCDATA内でのエラー

ライセンスページを作ってる際にエラーが出た

d.hatena.ne.jp

インターフェース内の省略範囲

  • インターフェース内に定義した内部クラスにpublic staticは省略できる
  • コンパイルすると自動的に付与してくれる

Parcelable内のwriteとreadの順番

 @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeInt(mUrl);
            dest.writeInt(mTitle);
        }

        public ParamDto() {

        }

        protected ParamDto(Parcel in) {
            mUrl = in.readInt();
            mTitle = in.readInt();
        }

このwriteとreadの順番が逆になっていると変数に入ってくる情報が変わってくる

Linearlayout内にdivider

真ん中だけ動的に区切り線をいれたいが、linearlayoutにviewをaddviewをしても、反映されなかった

qiita.com

dividerというものを設定できるみたいなので、これ便利

./gradlew app depencies

で依存しているライブラリを表示する gradleコマンド

ビルドが通らないソースをコミットしない

当たり前だけど、タイポミスがあったままコミットしてしまった。

javadocのtips

こんなのもある blogs.oracle.com

inflateの引数

inflate()の第三引数の話。 第三引数のboolean attachToRootの値は、falseにしないと第二引数に渡した親viewが返り値として返ってくる。

http://developer.android.com/intl/ja/reference/android/view/LayoutInflater.html#inflate(org.xmlpull.v1.XmlPullParser, android.view.ViewGroup, boolean)developer.android.com

scrollView内のlinearLayout

scrollViewもその中のlinearlayoutいずれもwrap_contentが推奨されている 実際にscrollView内のlinearLayoutにmatchをつけてもmatchにならない

  <style name="TaskDetailButton" parent="@style/Widget.AppCompat.Button.Borderless">

2016_01_04_CursorIndexOutOfBoundsException他

新年。引き続き学んだことの記録を。新年の抱負など冬休みの記録は改めて。

SDK更新後のAndroid studioのエラー

qiita.com

sdk更新したりしてたらエラー出まくって心臓に悪かった。

logcatでエラー

http://www.hangout.co.jp/blog/archives/148www.hangout.co.jp

こんなのが出まくる

dalvikvm﹕ VFY: unable to find class referenced in signature (Landroid/webkit/WebResourceRequest;)

http://theoldmanandthedroid.blogspot.jp/2013/06/fixbug-vfy-unable-to-find-class.htmltheoldmanandthedroid.blogspot.jp

SDK更新するとなったりするみたい。rebuild projectでひとまずはdalvikvmはいなくなった

リモートのコミットを取り消したい

qiita.com

CursorIndexOutOfBoundsException

www.glpgs.com

わかりやすかった。Cursorの性質みたいなのを知ってなきゃいけなかったのかな

Parcelableの話

http://y-anz-m.blogspot.jp/2010/03/androidparcelable.htmly-anz-m.blogspot.jp

AndroidでBorderBottomをつける

いつも忘れてしまう…

http://wada811.blogspot.com/2013/07/android-view-border-bottom.htmlwada811.blogspot.com

GradleのBuildが遅い!

Android Studio の ビルド がやけにトロい
android.benigumo.com

checkboxやradiobuttonのcheck部分を隠す

android:button="@null"

checkboxのcheckのデフォルトのstyleをリセットする。 buttonのデフォルトのstyleをリセットするにはbackground="@null"

scrollViewの下にfooterを置く

画面下部に固定配置
muchag.undo.jp

layout_weight=1をscrollViewに追加すると解決する、なんでや…

2015_12_25AndroidのwebViewでオレオレ証明書に対処する他

毎日会社で新しく学んだこと・調べたことをメモベースで公開することにしました! なんとなく知識が蓄積していないかを可視化するためにも。

build.gradle内のbuildTypesにタスクを作成する

noboru.hatenablog.jp

vividcode.hatenablog.com not fount buildConfig()とか言われたけどな

android webViewの設定

javascriptの設定など

http://y-anz-m.blogspot.jp/2010/07/androidwebview.htmly-anz-m.blogspot.jp

オレオレ証明書の対処法・仕組み

http://y-anz-m.blogspot.jp/2012/08/androidwebview-https.htmly-anz-m.blogspot.jp

開発用のwebViewを表示するためにこういう対処が必要になりました。 この対処法にいきつくまでに、SSLの知識?とか開発用のサーバーがどんな構造になっているかを問題を切り分けて考えることが必要でした。 (つまり時間かかった〜涙)