Unyablog.

のにれんのブログ

Android 6.0 がおかしいと思ったらバージョンが古かった

marshmallow のつづりが未だに覚えられないです。

原因わかったので追記しました。

症状(preview 3 で確認されていた症状)

さて、自分の作っている PhotoLinkViewer には「他のブラウザで開く」機能があります。例えば画像の開くアプリで PhotoLinkViewer をデフォルトのアプリに指定していて、その後画像だけではなくウェブサイトが見たくなった時などに重宝します。

これはどのように実現しているかというと、

startActivity(Intent.createChooser(new Intent(Intent.ACTION_VIEW, uri), getString(R.string.intent_title)))

として行っています。 createChooser を用いることでこのアプリをデフォルト設定している時でもアプリ選択画面が現れるようにしています。

しかし、この機能が Andorid 6.0 からうまく動かなくなってしまい、デフォルト設定していればまた PhotoLinkViewer が立ち上がってしまうようになりました。

ということで、queryIntentActivity を用いて Intent の対象となるアプリ一覧を取得してからそれを ListView で表示させるというコードに変更してみました *1

アプリ一覧を取得している場所は、

packageManager.queryIntentActivities(Intent(Intent.ACTION_VIEW, uri))

です。

これで開けるアプリ一覧を表示させたところ...

PhotoLinkViewer しか表示されない!

今回は twitter のリンクで使ってみたので、正常ならば twitter for android とか chrome とか firefox とかが一覧に出て来るはずなのです。これは明らかにおかしい。

対策はないかと調べてみたのですが困ってるという記事しかなく、android の issue にも似たものが最近登録された1つしかありませんでした。かなしい。

Issue 197280 - android - App Preference behavior is broken in Android 6 (and PackageManager.clearPackagePreferredActivities does not work as expected) - Android Open Source Project - Issue Tracker - Google Project Hosting

多分OSレベルの問題でどうしようもなさそうなので、とりあえずダミーのリンクを発行して開けるアプリを出すようにしようかなと今は考えていますが、その場合デフォルト設定しているブラウザアプリがあればそれが強制的に開いてしまうよなあ、とも思ったり...とにかく厳しいといった感じ。

↑ここまでが元の記事。

解決

twitterとかで検索してみると「andorid 6.0.1 では微妙に変化した」との噂が。よく考えたら僕の nexus5 には OTA が降ってきてない...

ということで無理矢理OTAをインストールしてみました...が成功しない。

原因を調べてみると、インストールされている AndroidAndroid M preview 3 のままだった という驚きの事実が判明しました。

僕はてっきり preview 3 から正式版にもアップグレードされると思っていたのですが、全くされることなく今まで使っていたのでした。

結局 ROM Image をダウンロードしてきて bootloader から焼いて最新の android 6.0.1 にすると無事直ってくれて、昔からの createChooser に戻りました*2

ということで preview 3 を入れていた方は、そのまま正式版になってない可能性が大きいと思うので気をつけましょう...

*1:昔 createChooser を知らなくてそういうコードを使ってたことがあったので...

*2:6.0 では確認していませんが、特に騒ぎも聞かないので直ってるんじゃないでしょうか。