FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    アプリ『トランプ・ジン・ラミー』を公開しました。
    Android/iOS https://goo.gl/PYKFYG

    タグ:Android6.0

      このエントリーをはてなブックマークに追加 Clip to Evernote
    a6-permission

    Android6.0ではパーミッションをユーザーが任意に変えられる仕組みが導入されました。アプリによっては動かなくなるような致命的な影響を与える変更なので、一度は公式のドキュメントを見た方が良いです。

    パーミッションには色々ありますが、一部のパーミッションは危険だという分類にされていて、そのパーミッションを使うにはユーザーが許可する必要があります。それも動的(アプリ実行時)に変わるので、パーミッションが必要な処理をするところではその都度許可されているか調べなくてはなりません。

    どのパーミッションが危険かはこの記事のNormal and Dangerous Permissionsを見てください。
    私はSNSで画像を添付するためのファイルの読み書き
    • android.permission.READ_EXTERNAL_STORAGE
    • android.permission.WRITE_EXTERNAL_STORAGE
    の許可が必要になりました。 (実はWRITEの方があれば良いんですが……)

    許可が与えられているかを調べるにはAndroidのContextCompat.checkSelfPermissionを使えば可能です。当然、この呼び出しはJavaになります。プラグインを作ることでも可能ですが、UnityにあるJavaクラスを呼び出すためのクラスAndroidJavaClassを使うとC#のコードだけで実装が可能です。以下にコードを置いておきます。


    Check("android.permission.WRITE_EXTERNAL_STORAGE")のようにするとパーミッションが許可されているか調べられます。

    このコードを利用しても次のエラーが出るでしょう。
    AndroidJavaException: java.lang.ClassNotFoundException: android.support.v4.content.ContextCompat
    これはライブラリがないため、クラスが見つからないということです。 Plugins/Androidフォルダを作り、そこにandroid-support-v4.jarを置いておけば解決できます。
    android-support-v4.jarはAndroid SDKをインストールしたフォルダにあるはずで、
    (AndroidのSDKフォルダ)\extras\android\support\v4にjarがあります。これをUnityのプロジェクトの適切な場所にコピーすれば良いです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    ゲームなどのアプリでは、SNS系のアプリ(Twitter、LINE、Facebookなど)に拡散できる仕組みを入れるのが常識になっています。文字だけの投稿もありますが、画像があった方が良いので最近は画像付きの投稿が行えるものも多くなっています。

    画像付きのツイートを送信するには当然画像がなければなりません。この画像はスクリーンショットを使うことがほとんどでしょう。画面を撮影した画像を特定のフォルダに保存して、その場所と文字列(アプリの紹介文だったり、ゲームの結果だったり)をTwitterアプリに渡すことで画像の付きのツイートができるわけです。
    画像を作ったり、Twitterアプリに適切なものを渡して連携するところもそれなりに難しいのですが、一度できてしまえばどんなアプリでも同じ仕組みで動きます。ちゃんと作るという条件付きですが、成功したら正しく動くのでわけのわからない問題は起きないでしょう。

    きちんと作って画像付きのツイートを送信することができたとしても、Android6.0では動かなくなることがあると判明しました。Android6.0に対応するように作っていないのだから、それはそうだという話ではありますが、Unityを使っているとAndroidを直接いじるのは面倒極まりないのです。なので対処法を見つけることにして、なんとかお茶を濁そうと考えています。

    原因はAndroid6.0以上のOSを使っている場合、権限の管理ができるようになったためでした。この権限のうちWRITE_EXTERNAL_STORAGEというファイルの保存に関わる許可を得られないと画像ファイルにアクセスできないため、画像付きのツイートができないのです。しかもTwitterが落ちることも結構あります。
    SS_TwitterAbort

    5.9以前ではアプリをインストールするときに必要な権限は全て許可するようになっていたので、開発者はAndroidManifestに必要なパーミッションを入れておけばそれで十分でした。
    しかしながら6.0ではユーザーが自由に権限をON/OFFできるようになってるため、それだと不十分なことがあります。「Android 6.0 以降のアプリの権限の管理」として公式ページで説明してあります。

    どのような操作をすると画像付きのツイートを送信できるようになるか
    をメモしておきます。Android6.0以前の端末ではきちんと動くのに6.0では動かないという場合、以下の対応で正常に動く可能性があります。(試した端末のAndroidバージョンは6.0.1でした。)
    まず画像付きのツイートをすると画像にアクセスできずにTwitterアプリが停止するといった症状が出る場合、設定->アプリを開き、Twitterにデータを渡している問題のアプリを開きます。アプリの情報が下のように表示されているはずです。
    許可というところをみると「権限が付与されていません」と出ています。この状態だと駄目なので、許可というところをタップして設定を変えます。許可をタップすると右のようにアプリの権限の一覧画面になります。ここではストレージという権限があり、それが無効になっているという状態です。
    SS_TN_PicTwi1 SS_TN_PicTwi2

    ストレージをタップして権限を有効化します。右の方にトグルが移動し、緑色になりました。これで権限がゆうこうになります。1つ前のアプリ情報の画面に戻ると、許可にストレージが現れています。
    SS_TN_PicTwi3 SS_TN_PicTwi4

    権限の有効・無効を設定した場合、一度アプリを終了させないと反映されないようです。意外と重要なことですが、忘れがちなことなので注意するべきです。


    Android6.0以降に対応したアプリでは権限の管理についても対応するというのが正しいあり方です。
    対応方法は開発者用の情報に載っています。当然AndroidのAPIを直接呼び出しています。
    権限があるか常にチェックするためのメソッドがあり、それにより権限が与えられているかを判定してプログラミングすれば良さそうです。また権限を要求するためのダイアログを出す機能も用意されていました。(Runtime Permissonとかで検索するとそれなりにヒットするので興味がある場合は調べてみるのもいいと思います。)

    端末ごとの対応はしたくないので、テキストだけのツイートにするかアプリの紹介ページに「Android6.0をお使いの方は~」 的な対処方法を書いておくのが現実的かなあというところです。
    アプリが落ちたりしないようなので、まあ妥協点です。 

    このページのトップヘ