2016年6月1日水曜日

設定からPermissionをOFFにされたアプリはいったん死ぬ

“The user can revoke the permissions at any time, by going to the app’s Settings screen.”
https://developer.android.com/training/permissions/requesting.html

タイトルが全て

以下は、読む必要なし。


Android 6.0から、設定画面の「アプリ」ってとこから権限(Permission)をON/OFFできるようになったよ。で、この画面でONにすると権限を付与できるんだ。

権限をOFFにしたときには、実行中のそのアプリのプロセスはKILLされるよ。メモリが足りなくなった時に(LowMemoryKillerによって)バックグラウンドアプリがKILLされた時と同じで、そのアプリがフォアグラウンドに戻ってきたタイミングでプロセスは復帰されるんだ。

権限がある!と思っていても、プロセス復帰したら権限なくなっているかもしれないってことだね!

権限がない場合を考慮していれば、問題にならないよね。プロセス復帰の対応がおろそかだと、ユーザーの操作で権限OFFにされた時に変なクラッシュするかもね〜

2016年5月30日月曜日

Intentを使ってカメラを起動するときにもCAMERA権限は必要になる?

これバグじゃないんだって

targetSdkVersion を 23 以上にしてますか?

Android 6.0 以降で Dangerous なパーミッションはRuntimeに権限要求する必要がでてきた。Androidユーザーとして嬉しい変更だ。
しかし開発者としては面倒だから targetSdkVersion を上げないでおいているアプリは多いだろう。

たとえば android.permission.CAMERA 権限は Dangerous なパーミッションとして分類されている。なのでカメラアプリを作るには、Runtimeに権限要求をする必要があるぞい。

あ、そうそうAndroid 6.0 以降で Intent を使ってカメラアプリを起動するときにも場合によっては、 android.permission.CAMERA の権限が必要になるぞい。

ということでバグ報告されております

これな https://code.google.com/p/android/issues/detail?id=188073

しかし、Googleの方は「え?バグじゃないよ」と回答。

  • この挙動はAndroidManifest.xmlにCAMERAの権限がある ときだけ起こる
  • ユーザーが設定画面でカメラ権限を無効化できるようにするため

だそう。なるほどね。なるほど……。

ライブラリプロジェクトに使っていないCAMERA権限がある場合は要注意!

実装方法

このように、ユーザーの利便性を考えて権限のON/OFFができるようにしたいって場合は、以下を使おう。

<uses-permission-sdk-23>
https://developer.android.com/guide/topics/manifest/uses-permission-sdk-23-element.html

これを使えば大丈夫ということだ!


ちなみに <uses-permission> には android:maxSdkVersion 属性があるから minSdkVersion もあるのかな〜と思ったらなかった。
https://developer.android.com/guide/topics/manifest/uses-permission-element.html

2016年3月17日木曜日

HyperCardの体験をiOS/Androidでできたらいいな

はじめまして。@DevMassive です。


HyperCardとは

(HyperCardが何なのかを知らない人がこのページにたどり着くことはないので略)

HyperCardがない

HyperCardっぽいものが世の中にないです。非常に悲しい。あなたもそう思っているのでしょう。間違いはないはずです。

プログラミングが身近にあった時代。
プログラミング言語が魔法だなんて幻想のなかった時代。

子供の頃のわたしに、つくることで自分を表現する楽しさを教えてくれたのは、HyperCardでした。

ぼーっと待っていれば、どこかの大人がまたあんなツールを作ってくれる。
そう思っていましたが、誰も作らず、気づけば僕も大人です。

しかも驚いたことに、プログラマになっていました。

つくったもの

iOS / Androidアプリ「ハナシカク」
http://door.develga.com/

当時のわたしはHyperCardを使いこなすには幼かったので、紙芝居とゲームの間のようなものをつくって遊んでいました。
2016年の現在、カンタンな紙芝居やゲームがつくりたいなら、Webサイトをつくればいいんです。Flashもあります(ありました)。Unityなんてものもありますね(なんと3Dです)。忘れちゃいけない、iOSアプリだってカンタンにつくれます(Appleがいうんだから間違いないですね)。

現代に必要なHyperCardは、それらよりもさらに作成のハードルが低いものだと考えました。

「ハナシカク」は絵本をつくるツールです。
ノートに描いたラクガキを、カメラに撮りながらつなぎます。
絵本のストーリーは分岐させることができます。
いまのところ、それだけです。

つくることで自分を表現する楽しさを、多くの人に伝えていきたい。
スマホ世代のHyperCardになるべく、これから可能性を探ります。

ぜひ使ってみてください。
そして、ご意見やご感想を聞かせてください。

このアプリや活動に興味を持たれた方のご連絡もお待ちしております。
Mail: support@develga.com
Twitter: @DevMassive


ビル・アトキンソンに感謝を込めて。

2016年2月11日木曜日

LibGDXで子Actorを切り抜くGroup

切り抜き

Group.setCullingArea() を使えば、矩形の範囲外にある子Actorを描画しなくなる。(カリング処理)
でも、少しでも矩形の中にはみ出てるActorはその全体が描画されてしまう。
だから、ある矩形で子Actor共々切り抜きたい時にはそぐわない。

そこで以下の様なGroupをつくっている。子ActorをaddActorして、setCullingArea()するとその矩形で切り抜いてくれる。
(batch.end()を使っているのでStageにたくさん置くと描画が遅くなるよ)
public class CullingGroup extends Group {
    private Rectangle mScissorBounds;
    public CullingGroup() {
        mScissorBounds = new Rectangle();
    }
    @Override
    public void draw(Batch batch, float parentAlpha) {
        getStage().calculateScissors(getCullingArea(), mScissorBounds);
        batch.end();
        batch.begin();
        if (ScissorStack.pushScissors(mScissorBounds)) {
            super.draw(batch, parentAlpha);
            batch.flush();
            ScissorStack.popScissors();
        }
    }
}
ちなみに、ScrollPaneは同じような処理を行なっている。

2016年2月3日水曜日

libGDXでフルスクリーンをやめる

フルスクリーンになりがち

libGDXはなんも設定しないとフルスクリーンになる。なんならImmersiveになる。なるべく大きくなろうとする。(Unityもそうだ)
でもそんなに大きくなられると困ることもある。
libGDXのバージョンによるだろうから、上から順にみていって怪しいところいじってみて欲しい。

Android

Theme

AndroidManifest.xmlをチェックすると
android:theme="@style/GdxTheme"
 というテーマになっているが、こいつのなかで
        <item name="android:windowFullscreen">true</item>
とある。これをfalseにする。

Config

AndroidLauncher.javaをチェックすると
AndroidApplicationConfigurationのインスタンスをデフォルトのまま使っている。これを

AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
config.useImmersiveMode = false;
config.hideStatusBar = false;
として、ImmersiveModeやステータスバーを非表示にする処理を抑制する。

Initialize

引き続きAndroidLauncher.javaをチェックすると、

initialize(app, config);
という処理がある。ここで様々なAndroidに関する初期化が行われるわけだ。しかしこのままだとまたステータスバーを非表示にする処理が走るので、
View view = initializeForView(app, config);
setContentView(view);
に変更する。

iOS

iOSは単純明快で、info.plist.xml の
<key>UIStatusBarHidden</key>
<true/>
をfalseにすればよい。