カテゴリーアーカイブ Android

村上 著者:村上

【Android】アプリ画面のスクリーンショットを禁止する方法

当初は最近使用している家計簿アプリのご紹介を使用と思っていたのですが、アプリがスクリーンショットを撮影できない設定になっていることが判明しました。
そのため、急遽予定を変更しまして、今回はアプリのスクリーンショット操作を禁止する方法についてご紹介!
というか、あまりスクリーンショット自体を撮らないし、アプリにも組み込んだことがなかったので、そもそもそんな機能があったことを知りませんでした…。

ちなみに、その撮影禁止のアプリでスクリーンショットを撮影しようとしたところ、下記の画像のようなメッセージが通知エリアに表示されました。

初めてみましたが、こんなことができたんですね!

 

今回参考にさせていただいたサイトはこちらから。

[Android]アプリでスクリーンショットを無効にする|DevelopersIO
https://dev.classmethod.jp/smartphone/android/prevent-screenshot/

実装方法は案外シンプルで、Activity の場合は、下記のコードを追加します。

Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE);

Fragment で実装したい場合は、下記のように記述するとのこと。

WindowManager mWindowManager; 
FrameLayout mOverlapView;
WindowManager.LayoutParams mParams;
 
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mParams = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_SECURE,
            PixelFormat.TRANSLUCENT);
    mWindowManager = (WindowManager)getActivity().
        getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    mOverlapView = new FrameLayout(getActivity());
    mWindowManager.addView(mOverlapView, mParams);
}
@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        mWindowManager.removeView(mOverlapView);
    } else {
        mWindowManager.addView(mOverlapView, mParams);
    }
}

なお、実際に無効化を操作しているのは、8行目からの mParams の記述になります。
そして、その操作を反映するために、onHiddenChanged() でその変更反映の処理を行っています。

Activity もしくは Fragment でのスクリーンショット禁止の記述は以上です。

 

以上、Androidアプリでスクリーンショット操作を禁止にする方法でした。
もし開発中のアプリでスクリーンショットを制御したい場合は、是非参考にしてください。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】外部サイトをアプリ内ブラウザで表示する方法

実際に試してはいないのですが、今後実装すると思われるので、その備忘録としてまとめ。

見つけた記事はこちらです。

PhoneGap/Cordovaでの外部サイトリンク 内部表示/アプリ内ブラウザ/標準のブラウザ – Qiita
https://qiita.com/tsunet111/items/272f3e052c332ddf9b9d

 

実装方法ですが、Cordova の初期テンプレートに最初から追加済みのプラグイン「cordova-plugin-whitelist」を使います。
まず、config.xml にアプリ内で表示したいアドレスを追加します。
記述例は下記のとおりです。

<allow-navigation href="https://cpoint-lab.co.jp/*" />

上の例では、このサイト全体の表示を許可しています。

<a href="https://cpoint-lab.co.jp/">株式会社シーポイントラボ</a>

あとは、aタグでリンクを設置します。
作業としては以上です。
こちらを実行すると、ホワイトリストに追加したアドレスであれば、内部ブラウザで表示されます。
なお、それ以外のアドレスにアクセスした場合は、端末のデフォルトブラウザが起動しますので、ご注意ください。

 

以上、Cordovaアプリのアプリ内ブラウザで外部サイトを表示する方法でした。
もし、上記の方法でうまくいかない場合は、「cordova plugin add cordova-inappbrowser」を使う方法もあるとのこと。
ホワイトリストが働かない場合は、こちらのプラグインもお試しください。

  • この記事いいね! (0)
村上 著者:村上

【Android】XMLデータから特定のタグの値を取得する方法

もしかしたらもっとスマートなやり方があるのかもしれませんが…問題なく動作しますので、XMLの扱いでお悩みの方は是非。
XMLデータから、特定のタグの値を取得する方法です。
なお、参考にしたサイトをうっかり失念してしまったので、今回はリンクはありません。

 

では早速、コードはこちら。

private void getXmlData(String xml) throws XmlPullParserException, IOException {
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    XmlPullParser parser = factory.newPullParser();
    parser.setInput(new StringReader(xml));
    int eventType = parser.getEventType();

    String data;
    List<String> arrData = new ArrayList<>();

    while (eventType != XmlPullParser.END_DOCUMENT) {
        if (eventType == XmlPullParser.START_TAG) {
            switch (parser.getName()) {
                // データを取得したいタグが一つ
                case "[データを取得したいタグ名]":
                    parser.next();
                    data = parser.getText();
                    break;
                // データを取得したいタグが複数
                case "[データを取得したいタグ名]":
                    parser.next();
                    arrData.add(parser.getText());
                    break;
            }
        }
        eventType = parser.next();
    }
}

こんな感じです。
関数にしているので、そのままコピー&ペーストしてもらえば動作するかと思います。
なお、渡すXMLでデータは 文字列 に変換しています。

重要そうな部分だけを説明すると、10行目から XMLデータを while で、タグやデータなど 1つずつ見ていって、それが開始タグで、かつそれがデータを取得したいタグだった場合はそのタグの値を取得しています。
また、14行目からの case句は、タグが一つしかない場合のデータの取得方法で、対して 19行目からの case句は、タグが複数あった場合のデータの取得方法です。
といっても、データを格納する変数が StringList かの違いしかないのですけどね。

これでデータの取得ができますので、あとはこのデータを行いたい処理などに使ってください。

 

以上、XMLデータから特定のタグのデータを取得する方法でした。
やり方を変えれば、全タグのデータも取得できるかと思いますので、是非ご活用ください。

  • この記事いいね! (0)
村上 著者:村上

【Cordova】FCMを導入した時の「Error: Invalid data, chunk must be a string or buffer, not object」エラー対処法

今回は、Cordovaアプリに cordova-plugin-fcm を導入した際に発生したエラーについてです。
なお、端末は Android です。
エラーはこちら。

Error: Invalid data, chunk must be a string or buffer, not object

翻訳すると、「エラー:無効なデータです。チャンクはオブジェクトではなく文字列またはバッファでなければなりません」とのこと。
これだけだとよく分かりませんが、FCM の導入時に作成した google-services.json が関係しているのでしょうか。
が、ファイルを置く場所はあっているし、内容もダウンロードした時のままなので、間違っているはずもなく…。

 

そして調べたところ、下記の記事がヒットしました。

Cordovaで cordova-plugin-fcm を追加すると発生するエラーを消す方法 – 備忘録
https://kagasu.hatenablog.com/entry/2018/10/04/215302

まさに求めていた内容そのもの!
原因は分かりませんでしたが、対処法としては、fcm_config_files_process.js というファイルを、下記の内容に置き換えて実行するだけでした。
なお、fcm_config_files_process.js の場所は、下記にあります。
[プロジェクト名]/plugins/cordova-plugin-fcm/scripts/fcm_config_files_process.js

書き換えるファイルの内容については、下記をまるっとコピー&ペーストしてください。

Invalid data, chunk must be a string or buffer, not object・Issues #213・fechanique/cordova-plugin-fcm・GitHub
https://github.com/fechanique/cordova-plugin-fcm/issues/213#issuecomment-357162384

あとは、通常通りビルドしたところ、発生していたエラーが表示されなくなりました。

 

以上、cordova-plugin-fcm 導入時に発生したエラーの対処法でした。

  • この記事いいね! (0)
takahashi 著者:takahashi

他のデバイスのWindowsのサブディスプレイ化が簡単にできるアプリ”spacedesk”

Windows 10 から、Windowsには標準機能で”このPCへのプロジェクション”機能がついています。
この機能を使うと、Miracast対応デバイスをWindows PCのサブディスプレイとして使うことができます。
標準機能なので手間もかからず、安心して使えるのはとてもいいところなのですが、まだ粗削りな部分が多く、解像度の相性が悪かったりすると画面のサイズが合わなかったり、うまく動作しなかったりという部分がまだあります。
また、Miracast対応デバイスでないと接続できないため、mac OS/iOSやLinux等では通常利用できません。

そんなこともあって代替えになりそうなアプリをいろいろ探していたところ、こちらのアプリを見つけました。

spacedeskというアプリです。

サーバー(仮想ディスプレイを使う側)はWindowsのみ対応になっていますが、クライアント側(仮想ディスプレイになる側)はWindowsの外に、iOSとAndroidのデバイスも使うことができ、さらにHTML5版も用意されているので、macOSやLinux、ChromeOSなどでも利用することができます。

自分の手元のPCで試したところ、アプリ版よりもHTML5版の方がより高速に動作している印象でした。

大きなメニューアイコンが出てくるのが玉に瑕ですが、使っている分にはあまり気になりませんでした。

操作も簡単で使いやすいので、暫く使ってみたいと思います。

  • この記事いいね! (0)
村上 著者:村上

【Android】EditTextでの文字の複数行入力とInputTypeの種類

Androidアプリ開発では、文字を入力できる項目として EditText があります。
今回は、この EditText で文字を複数行入力するときの指定方法と、それ以外の入力タイプについて簡単にまとめ。
完全私的見解ですが、特によく使いそうなものをピックアップしました。

なお、今回参考にさせていただいた記事はこちらから。

Androidアプリ入門 No.09 EditTextの入力制限関連属性 – コンピュータクワガタ
https://kuwalab.hatenablog.jp/entry/20101213/p1

 

まず最初に、文字を複数行入力するときの設定について。
入力する値は inputType で指定します。
で、複数行の入力を許可するときには textMultiLine という値を指定します。
サンプルは下記のとおりです。

<EditText
    android:layout_width="match_parent"
    android:layout_height="200dp"
    android:inputType="textMultiLine" />

最終行で、inputType に textMultiLine を指定しています。
これがあることで、改行が可能になります。

 

それ以外の設定値については下記のとおりです。

設定値 説明
none 入力禁止
text 通常のテキスト
textMultiLine 複数行に渡るテキスト
textPassword パスワード
textEmailAddress メールアドレス
textPersonName 人名
textPostalAddress 住所
phone 電話番号
datetime 日付・時刻
date 日付
time 時刻
number 数値
numberSigned 符号付き数値
numberDecimal 少数

他にもまだいくつかありますが、個人的に使いそうなものだけをピックアップしました。
ほかの入力パターンを知りたい場合は、上で挙げた参考記事をご確認ください。

 

以上、AndroidのEditTextで複数行を入力する方法と、入力タイプの種類についてでした。
意外とこういう設定値って、毎回忘れてその都度調べたりするので…調べる時間を節約したくて今回まとめてみました。
皆様の参考になれば幸いです。

  • この記事いいね! (0)
takahashi 著者:takahashi

位置情報ゲームIngressがリニューアル!Ingress Primeがついに公開!!

先日、IngressのTwitterアカウントで公式以前から予告されていたIngressのリニューアル版、Ingress Prime がリリースされたというツイートが投稿されました。

早速インストールしてみました!

起動するとIngressの開発元であるNianticのロゴが表示され…

ログイン画面が表示されるので、旧バージョンで使用していたGoogleアカウントでログインします。

Facebookアカウントも使えるようになったようですね…!

ログイン中…

めちゃくちゃクールなサイバーな音とともに、Ingressのスプラッシュが表示されました…!

現在地測位中の画面がすでに超クールになってます…!

XMスキャナー起動中画面…ヤバイ、クールすぎる…

起動準備完了(?)したようで、”タップして起動”の文字が。

この後、チュートリアルとしてXMやポータル、Ingressのルールについての説明が出てきますが、極秘書類のようなのでこちらでは伏せておきます(w

ちなみに、既にエージェントになっているユーザーはチュートリアルは表示されないようです。
チュートリアルではADAやジャービスのフルボイスも聞けたということらしいのでちょっと残念です。

最後にレジスタンス陣営のトップでもあるADAさんが直々に挨拶(?)していきましたw

そしていよいよスキャナが起動…

うおおおおすげええええ
めっちゃ綺麗になってる!!!
UIも一新されています。

中心のボタンを押すとメニューが表示されます。
アイテムストレージの”Inventory”、ポータルへアタックするためのXMウェポンの一覧を表示する”Attack”、同陣営やエージェント全体とテキストメッセージのやり取りができる”Comm”が一番押しやすい位置に置かれています。

これらはよく使う機能なので、押しやすい位置に移動したのはかなり好感が持てますね。

早速Attackを選ぶと

こんな画面に。
アイテムのデザインも一新されていて、とにかくキラキラしてますw

実体がないXMから作られているアイテムなので、こうちょっと幻想的なデザインになっているのはちょっと惹かれますね。


旧バージョンのスキャナと同様、攻撃時に長押しするとサークルが表示され、一番中心にに来た時に離すと一番強い威力でアタックできる仕様は引き継がれていましたが、個人的には新バージョンの方がやりやすい印象でした。

ただ、アタックしたときのポータルのダメージエフェクト、例えばModが破壊されたときのエフェクトがちょっと見づらくて、いつまで武器を打ち続ければいいのかわかりづらいのがちょっと惜しかったです。

インベントリもかなり変更されていて、ポータルキーとアイテムが分けて表示されるようになりました。
アイテムが探しやすくなったのはありがたいです。

そして総じてデザインがカッコイイ…!!!

他にもいろいろと変更されていますが、何より全体的にエフェクトが豪華になっていることでより没入感が増していて、とても興奮しました!

なお、端末が対応できなかったり、旧来のIngressの方がいい、という場合は、旧バージョンのアプリも引き続き利用できるとのことです。

新アプリはそこそこ重いので、旧アプリも使えるのはありがたいですね。

まだ新バージョンを入れたばっかりで触り切れていないので、また機会があれば記事にしてみたいと思います。

Ingress Prime – GooglePlayStore

Scanner [REDACTED](未公開版)- GooglePlayStore

  • この記事いいね! (0)
村上 著者:村上

【Cordova】ローカル通知機能を実装するためのプラグイン「cordova-plugin-local-notifications」

今回は、アプリにローカル通知を送る方法について。
アプリから通知を送るには、以前にも何度か記事に取り上げた cordova-plugin-fcm など、インターネット経由で外部サービスと連携してプッシュ通知を送る方法がありますが、ローカル通知はアプリ自身が通知を送る仕組みです。

プラグインは「cordova-plugin-local-notifications」を使用しています。
GitHubはこちらから。

GitHub – katzer/cordova-plugin-local-notifications: Cordova Local-Notification Plugin
https://github.com/katzer/cordova-plugin-local-notifications

 

まずインストール方法ですが、下記のコマンドを実行します。

cordova plugin add cordova-plugin-local-notification

ローカル通知を送るには、下記のコードを実行します。

cordova.plugins.notification.local.schedule({
    title: '[タイトル]',
    text: '[メッセージ]',
    foreground: true
});

最低限、上記のタイトルやメッセージテキストなどを指定すれば、即時に通知が送付されます。
他にも指定できる項目があり、添付ファイルや、”Yes”、”No” などのボタン、更には文字の入力欄を追加することもできます。

また、trigger という項目を指定することで、送付するタイミングや、繰り返し通知することもできます。
現時点では使ってはいませんが、こちらも便利そうですね。
サンプルコードはこちら。

// 指定した時間にローカル通知を送付
cordova.plugins.notification.local.schedule({
    title: '[タイトル]',
    text: '[メッセージ]',
    trigger: { at: new Date([年], [月], [日], [時]) }
});

// 指定した回数だけ毎日通知する
cordova.plugins.notification.local.schedule({
    title: '[タイトル]',
    text: '[メッセージ]',
    trigger: { every: 'day', count: [回数] }
});

個人的には、あるエリアに行くと通知する、という下記のコードも便利そうだと思います。

cordova.plugins.notification.local.schedule({
    title: '[タイトル]',
    text: '[メッセージ]',
    trigger: {
        type: 'location',
        center: [lat, long],
        radius: [通知半径],
        notifyOnEntry: true
    }
});

ただし、こちらの位置による通知は iOS 未対応のようです。
ご利用になる際には、その点だけご注意ください。

 

以上、アプリにローカル通知を送信する方法についてでした。
予定のリマインドなど自分自身に通知を送りたいだけの時には、こちらのプラグインで十分だと思います。

  • この記事いいね! (0)
村上 著者:村上

【Android】アプリ内にデータを保存できる「SharedPreferences」

Androidでアプリを開発する際、ちょっとしたデータを保存したいときがあるかと思います。
Webであれば、Cookie や LocalStorage が使えますが、Android の場合でもよく似た仕組みがあります。
それがこちらの「SharedPreferences」です。

参考にさせていただいたサイトはこちら。

[Android] データを保存し Android Studio で確認 SharedPreferences
https://akira-watson.com/android/sharedpreferences.html

 

早速使い方はこちら。

SharedPreferences dataStore = getSharedPreferences("DataStore", MODE_PRIVATE);
Editor editor = dataStore.edit();
// 保存するデータを追加
editor.putString("input", "abcdefg");
editor.apply();

なお、getSharedPreferences() の第2引数で指定している MODE_PRIVATE とは「このアプリからのみ読み書き可能」という意味になります。
基本的には、これでOKだと思います。

また、データはほかにも下記の型を保存できます。

editor.putInt("DataInt", 123);
editor.putBoolean("DataBoolean", true);
editor.putLong("DataLong", 12345678909876L);
editor.putFloat("DataFloat", 12.345f);

そして、読み出しは下記のようになります。

String dataString = dataStore.getString("input", null);

読み出しについてはいたってシンプルですね。
なお、第二引数には、データを取得できなかった場合の代用値を指定します。

他の型の取得については下記のとおりです。

int dataInt = dataStore.getInt("DataInt", 0);
boolean dataBoolean = dataStore.getBoolean("DataBoolean", false);
long dataLong = dataStore.getLong("DataLong", 0);
float dataFloat = dataStore.getFloat("DataFloat", 0);

 

以上、アプリ内にデータを保存できる SharedPreferences の使い方でした。
データベースに保存するまでもないような、小さなデータなどでしたらこれで事足りるかと思います。
是非、便利に使ってください。

  • この記事いいね! (0)
村上 著者:村上

【Android】XMLをJSONに変更できるライブラリ「JSONIC」

結論から言うと、私の環境ではうまく使えなかったので、実際の使用は見合わせました。
が、かなり便利そうだったので、いつか使うとき用に備忘録としてまとめます。

今回紹介するのは、「JSONIC」というJava用のシンプルかつ高機能なJSONエンコーダー・デコーダーライブラリです。
GitHubはこちらから。

GitHub – hidekatsu-izuno/jsonic: simple json encoder/decoder for java
https://github.com/hidekatsu-izuno/jsonic

…しかし、よく見たら、今後機能強化が行われることがないメンテナンスモードに移行するとのこと。
もし利用する場合は、jackson への移行をおすすめしているとのことでした。

 

使い方のサンプルコードはこちら。

import net.arnx.jsonic.JSON;

// POJOをJSONに変換します
String text = JSON.encode(new Hoge());

// JSONをPOJOに変換します
Hoge hoge = JSON.decode(text, Hoge.class);

いたってシンプルです。

また、XMLをJSONに変換したい場合は、下記のようにします。

Document doc = builder.parse(new File([変換したいXMLファイル]));
String xmljson = JSON.encode(doc);

例えば、下記のようなXMLファイルを変換すると、

<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Feed Title</title>
  <entry>
    <title>Entry Title</title>
  </entry>
</feed>

変換後のJSONは下記のようになります。

["feed", {"xmlns": "http://www.w3.org/2005/Atom"},
    ["title", "Feed Title"],
    ["entry",
        ["title", "Entry Title"],
    ]
]

なお、この時、タグ間の空白文字も TextNodeとして出力されるらしいので、これが不要な場合は、DOM作成時に取り除く必要があるとのことでした。

 

以上、簡単ではありますが、JSONIC ライブラリの使い方でした。
もし、JSONのエンコード・デコードをシンプルに行えるライブラリをお探しでしたら、参考にしていただければと思います。
が、最初に書いたように、JSONIC は今後機能強化を行わないとのことでしたので、利用する場合は、jackson を使用するようにしてください。

  • この記事いいね! (0)