カテゴリーアーカイブ Android

村上 著者:村上

【Cordova】端末内のファイルを開くプラグイン「cordova-plugin-file-opener2」

前回、端末に画像や音声ファイルをAndroidなどの端末にダウンロードするプラグインを紹介したので、今回は端末内のファイルを開く方法について。
使用したプラグインは「cordova-plugin-file-opener2」です。

GitHubは下記からご確認ください。

GitHub – pwlin/cordova-plugin-file-opener2: A File Opener Plugin for Cordova
https://github.com/pwlin/cordova-plugin-file-opener2

 

プラグインの導入は、例のごとく下記のコマンドを実行します。

cordova plugin add cordova-plugin-file-opener2

使い方はとても簡単で、下記のように開きたい端末内のファイルのパスと、その MIMEタイプを指定するだけ。

cordova.plugins.fileOpener2.open(
    [開きたいファイルのパス], 
    [ファイルのMIMEタイプ], 
    {
        error : function(){
            // ファイル展開 失敗時に実行する処理
        }, 
        success : function(){
            // ファイル展開 成功時に実行する処理
        } 
    } 
);

ファイルのパスは、/storage/emulated/0/Pictures/[ファイル名].jpg のような感じで指定します。
こちらのパスの値については、私の環境では、ファイルダウンロードに成功した時に取得できる file:///storage/emulated/0/Pictures/[ファイル名].jpg から、file:// を取ったものを使っています。

ご覧の方の環境に合うかは分かりませんが、参考にコードを記載しておきます。

window.document.addEventListener('DOWNLOADER_downloadSuccess', function(event) {
  const data = event.data;
  const filePath = data[0].nativeURL.replace(/^file:\/\//, '');

  if (fileMIMEType !== null) {
    window.cordova.plugins.fileOpener2.open(
      filePath,
      'image/png',
      {
        error: function() {
          // ファイル展開失敗時の処理
        },
        success: function() {
          // ファイル展開成功時の処理
        },
      }
    );
  }
});

こちらはとりあえずAndroidで動作するようにしてあるだけなので、iOS には対応していません。これからやります。
なお、MIMEタイプについても、とりあえず png 形式のみ対応なので、もし扱うファイル種類が定義されていない場合は、拡張子で jpg、gif くらいは判断できるようにしたほうが良さそう。

ちなみに、動作確認中に、うっかり音楽ファイル(mp3)を imgae/png で開いてしまいましたが、エラーにはならず、ファイルが壊れているような表示になりました。
その後、きちんと audio/mp3 にしたら、開くアプリの選択肢が表示され、再生もできるようでしたので、音声ファイルも問題なさそうです。

 

以上、Android端末内のファイルをアプリで開く方法でした。
とりあえず、Androidに問題がなかったので、iOS でも使えるように修正していきたいと思います。

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

【Cordova】端末にファイルをダウンロードするプラグイン「cordova-plugin-file-downloader」【解決済】

昨日投稿した、「cordova-plugin-file-downloader」について、問題なく動作させることができたので…というか、ダウンロードできていたことが分かったので、それのご報告です。

昨日の記事はこちらから。

【Cordova】端末にファイルを保存するプラグイン「cordova-plugin-file-downloader」【未動作】
https://cpoint-lab.co.jp/article/201811/【cordova】端末にファイルを保存するプラグイン「cordova-plugi/

 

ダウンロードしたファイルの確認方法ですが、私の端末(Android 7.0)では「ダウンロード」アプリから確認ができました。
まず、アプリ一覧から「ダウンロード」アプリを開き、サイドメニューから、端末のローカルストレージを選択します。
画面イメージは下記のとおりです。

ローカルストレージを選択すると、フォルダ一覧が表示されるので、ここからプラグインの初期設定時に folder で指定したフォルダ名を探します。
無事見つかれば、このフォルダ内にダウンロードしたファイルが保存されているはずです。

ちなみに、そのコードはこちら。

downloader.init({folder: "[端末の保存先ファイル名]"});

ということで、ただ単に私がダウンロードが完了したファイルを探せなかっただけでした!
大変失礼致しました…!

 

さてしょうもない結末だったので、ダウンロード後の処理を記述する方法についてご紹介したいと思います。
オプションに onSuccess とかの指定ができなかったので、てっきり出来ないかとも思いましたが、ちゃんとありました!
コードは下記のとおりです。

document.addEventListener('DOWNLOADER_downloadSuccess', function(event) {
  const data = event.data;
  console.log(data[0].name);
  console.log(data[0].fullPath);
  console.log(data[0].nativeURL);
});

document.addEventListener の第一引数で、DOWNLOADER_downloadSuccess を指定すると、ファイルのダウンロードに成功した時にこの関数が呼び出されます。
で、変数 event に、データが入っているので、上記のように指定すると、ファイル名や保存先のパスなどが取得できます。

第一引数は、他にも DOWNLOADER_downloadErrorDOWNLOADER_downloadProgress なんかもあるので、ご要望に合わせて使い分けてください。

 

以上、cordova-plugin-file-downloader を使ったダウンロード方法とダウンロードしたファイルの確認方法でした。

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

【Cordova】端末にファイルを保存するプラグイン「cordova-plugin-file-downloader」【未動作】

Cordovaアプリにて画面にダウンロードボタンを配置し、それをタップしたら、あらかじめ指定しておいた画像ファイルをダウンロードする、という処理を行いたいのですが…現在、絶賛苦戦中です。
今回使用しているプラグインは「cordova-plugin-file-downloader」です。
コードがとてもシンプルで簡単だったので、指定ミスはないはずなのですが…。
エラーが発生しない、私の苦手なパターンにハマっています。

公式ページはこちらから。

GitHub – mramonlopez/cordova-plugin-file-downloader: Phonegap plugin to download a list of files or a single file to the phone, check consistency and unzip if necessary (Android and ios)
https://github.com/mramonlopez/cordova-plugin-file-downloader

cordova-plugin-file-downloader – npm
https://www.npmjs.com/package/cordova-plugin-file-downloader

 

プラグインの導入時は、下記のコマンドを実行します。

cordova plugin add cordova-plugin-file-downloader

もっともシンプルな実装方法は下記のとおりです。

downloader.init({folder: "[端末の保存先ファイル名]"});
downloader.get("[保存したいファイルのパス]");

1行目の初期化については、オプションがいくつかありますが、folder については必須事項なので、必ず指定してください。
例えばアプリ名などの文字列を指定すればよいかと。
他にも、zipファイルをダウンロードした際に、ダウンロード完了後に解凍する unzip や、展開後の zip ファイルを削除する delete オプションもあります。
また、wifiOnly という、Wi-Fiに接続されているときのみダウンロードを行うというオプションもあります。
なお、これはデフォルト値が true なので、あえて指定する必要はなさそうです。

 

プログラムとしては以上なので、こちらを実行すれば動作するはずが…何故かダウンロードできず。
ログには、download [ダウンロードしたファイルのパス] to [端末に保存したファイルのパス] とか、Saved file: [端末に保存したファイルのパス] というメッセージがあったので、ダウンロードできているようにも見えたのですが、いくら探してもダウンロードした画像が見つかりませんでした。
なおインストール時に、下記を config.xml の タグ内に追加しろとあったので、それについては対応しました。

<preference name="AndroidPersistentFileLocation" value="Compatibility" />

こちらのコードの意味は、以前の設定(Compatibility)をそのまま使用してファイルの保存するという意味になるとのこと。
value は Internal という値を指定することも可能で、こちらでは内部の保存場所を使用します。

 

幸い、若干の時間的猶予はあるので、引き続き調査したいと思います。
もしくは、違うプラグインを使うことを検討してもいいかもしれませんね。

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

車用Android向けホームランチャーアプリ”Car Launcher”

Androidタブレットナビ化計画の一環でインストールしたホームアプリをご紹介します!

Car Launcher“というアプリです。

車用ランチャーアプリには、単なるランチャーで、ホームボタンを押すと素のホームアプリに戻ってしまうものもありましたが、こちらのアプリはちゃんとホームアプリとして動作するので、完全に差し替えできます。

デフォルトのUIはこんな感じです。

音声検索や天気、時刻、音楽プレーヤーへのショートカットなどが一通りそろっています。

また、上のAdd App からよく使うアプリケーションを追加できます。

このUIもそこそこ使いやすそうではあるのですが、個人的にデザインがあまり好きではなかったので…

こちらのUIに変更しました。
よりランチャーっぽくなっていい感じです。

Android端末をカーナビ代わりにしている方には是非お勧めです。

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

【Android】端末の戻るボタンが押されたときに処理を実行する

Android アプリを開発中、端末の戻るボタンが押下されたかどうかを検知したいことがあると思います。
例えば、EditText エリアに何かを入力中に、うっかりボタンを押してしまっても、前のページに戻る前に確認のアラートを出すような機能を追加するときや、そもそも戻るボタン自体を無効にしたい、などです。
私も極たまにしか使わないので、備忘録としてまとめます。

 

といっても実装はとっても簡単で、下記のように onBackPressed をオーバーライドするだけです。

@Override
public void onBackPressed(){
    // 行いたい処理
}

あとは、この関数内で、戻るボタンが押されたときに実行したい処理を書くだけです。

私の場合、下記のような実装を行いました。

@Override
public void onBackPressed(){
    // EditTextに入力された文字列を取得
    EditText editText = findViewById([ID名]);
    if (editText.getText().equal("")) {
        finish();
    } else {
        // ダイアログ表示
        new AlertDialog.Builder(this)
                .setTitle([タイトル])
                .setMessage([メッセージ])
                .setPositiveButton("OK", (dialog, which) -> {
                    // OKが押された場合、Activity を終了し、前のページへ
                    finish();
                })
                .setNegativeButton("キャンセル", null)
                .show();
    }
}

上のコードでは、戻るボタンが押されたときに、EditText に入力された文字列を取得しています。
この時、EditText に何か文字が入力されていた場合、まだ編集中とみなし、警告のダイアログが表示されるようにしています。
EditText が空だった場合や、ダイアログでOKが押された場合は、finish() を実行し、現在表示されているアクティビティを終了して、前のページに戻ります。

 

なお、戻るボタンを検知する方法としては下記の記述方法もあります。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        // 戻るボタンの処理
        
    }
}

この書き方を用いると、戻るボタン以外の検知にも使えます。
複数のボタンの検知の処理を書きたい場合には、こちらのほうが便利ですね。
ですが、今回は戻るボタンの検知のみが行えればOKだったので、私は前者を使いました。
なんといっても、関数名が分かりやすいですし。
このあたりは、好みと実装内容によって使い分けてください。

 

以上、Androidアプリで戻るボタンが押されたことを検知する方法でした。

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

【アプリ】眠れない夜にはメトロノームがいい?「Metronome Beats」

不眠症ではないはずですが、たまに眠れない夜とかがあったりします。
今までは、「寝たまんまヨガ」とか「Relax Melodies」を使っていたのですが、先日下記の記事を見つけたので、早速実践してみました。

寝つきが悪かった方が一瞬で眠れるようになった方法を描いた漫画に「効果ありそう」「逆に無理そう」「この方法も」など様々な声 – Togetter
https://togetter.com/li/1288882

なんでも、15~30分間くらいの時間、メトロノームを掛けて寝るだけというもの。
リズムは 20~30 くらいの聴いていて遅いと感じるくらいで、かつ音量もかなり小さめに設定するといいそうです。

 

私が使っているアプリは「Metronome Beats」です。
Google Play で探していて、なんとなく画面が格好良くて使いやすそうだったのでこちらをチョイスしてみました。
勿論、他に愛用しているアプリがあるなら、そちらをご利用ください。

インストールはこちらから。
ちなみに、Androidです。

メトロノームのビート – Google Play のアプリ
https://play.google.com/store/apps/details?id=com.andymstone.metronome&hl=ja

そして、実際のアプリ画面はこんな感じ。

主に使うテンポとかタイマー機能の設定が分かりやすいです。
画面を見れば分かると思いますが、私はテンポを 19 で設定しています。
私の場合、このリズムが深呼吸のタイミングにぴったりなんです。
また、タイマーは 30分に設定しています。
勿論、これは私の好みの値なので、適宜気持ちいいと思えるようにカスタマイズしてください。

実際にここ2~3日使ってみたところ、確かに寝つきが良い気がする…!?
実は一人暮らしを始めてから、実家に帰ると時計の秒針がうるさくて眠れない事があったのですが、これは音量が調整できるのと、テンポがゆっくりなためか、全く気になりません。
まあ思い込みしやすいタイプなので、プラシーボ効果とかもありそうですが…それで寝られるなら良いと思います。
しばらく継続して使ってみようと思います。

 

以上、おすすめのメトロノームアプリと、個人的なおすすめ設定値のご紹介でした。
寝つきが悪いと感じている方は、ぜひお試しください。

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

自分のスマホにGoogleLensが来たので試してみた!

自分はAndroid 6搭載のスマートフォンを使用しているのですが、ある日ふとGoogleアシスタントを起動したところ、”Google Lens”が追加されていました。


Google Lensとは、スマートフォンのカメラを使って得られた画像に映っているものや文字をAIが認識し、それらに関連する情報を検索・表示してくれる仕組みです。
最初はGoogleのリファレンススマートフォンであるPixelシリーズのみで利用が可能でしたが、現在はほぼすべてのAndroid端末で利用できるようです。

 

例えば、社内にあるグループ会社のはまぞうの旗。

これをGoogle Lensに読み込ませると…

こんな風に画像だけで関連する情報を簡単に検索できます。

他にも、花を撮影すればその花の名前を判定したり、名刺を撮影すれば記載内容を全てテキストにして取り出したりなど、かなりいろんなことができるようです。

結構面白い機能なので、対象の端末をお持ちの方は是非一度試してみてはいかがでしょうか。

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

【備忘録】Firebase Cloud Messagingでのプッシュ通知の送信について

実は似たような記事を以前にも投稿しましたが、今回はメッセージを送付する際のHTTP構文についてです。
というのも、送信メッセージやタイトルを変えるだけならまだしも、パラメータを変更したり、追加・削除するときに毎回調べていたので、いい加減自分のためにまとめようと思ったからです。

そのため、この記事は私的重要ポイントのみをまとめてあります。
ご了承ください。

ちなみに、以前の記事はこちら。

【PHP】FireBase Cloud Messagingを利用したプッシュ通知をPHPから送る方法 – 株式会社シーポイントラボ|浜松のシステム開発会社
https://cpoint-lab.co.jp/article/201810/【php】fireBase-cloud-messagingを利用したプッシュ通知をphpから送る/

 

さて、まず Firebase の公式サイトのHTTP プロトコルについてのページがこちら。

Firebase Cloud Messaging の HTTP プロトコル|Firebase
https://firebase.google.com/docs/cloud-messaging/http-server-ref?authuser=0

このページですら毎回検索して探すので、こうしてまとめたかったというのが主ですね。

次に、各項目について。
送信先を指定するパラメータ to について、その具体的な指定値です。

指定値 対象
/topics/all 全端末に送信
/topics/android Android端末にのみ送信
/topics/ios iOS端末にのみ送信
/topics/[トピック名] 特定のトピックに登録されている端末にのみ送信
[デバイストークン] 特定の端末

こちらに関しては、特に説明不要かと思います。
送信先を指定したい場合、こちらの to の値を変更しますが、例が載っていなかったので、よく使いそうなもののみを抜粋しました。

次は dry_run というパラメータです。
こちらは未指定の場合のデフォルトは false になっています。
このパラメータを true にすると、実際にプッシュ通知を送らずに、レスポンス結果を取得することができます。
送信のテスト時に使うパラメータですね。

あとは、badge という、ホーム画面のアイコンにバッヂを追加するためのパラメータです。
こちらにバッヂの値を指定すると、プッシュ通知を受信した時にバッヂが追加されます。
なお、0 を指定すると、バッヂは削除されます。

よく使うのはこのあたりでしょうか。
他にも、Androidのみの設定で icon というパラメータでプッシュ用のアイコン画像を指定できます。
これがないと、アイコンが白い四角形になってしまい非常に味気ないので、Android アプリに通知を送る際は指定したほうが良さそうです。

 

以上、FCM でメッセージを送付する際のHTTP構文についてでした。
なお、レスポンスデータについては、上で挙げた Firebase の公式サイトのHTTP プロトコルについてのページの下の方に載っているので、こちらも参考にしてください。

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

androidのあらゆる操作を自動化してくれるアプリ”macrodroid”

今回も、使わなくなったAndroidタブレットをナビ化する際に役に立ったアプリをご紹介したいと思います。

Macrodroidというアプリです。
デバイスが取得できるありとあらゆるきっかけをトリガーにして、様々な挙動を自動で行わせることができます。

起動すると画面のような表示が出てくるので”マクロの追加”をタップします。

最初に、何らかの動作をさせる際のきっかけとなる動作を指定します。

例えば、”充電器に接続した時”とか、”画面のロックを解除したとき”などなどです。

これらの指定の一部は以前ご紹介したSmartConnectでもできましたが、Macrodroidの特徴はそれをはるかに上回る種類のトリガーを仕掛けることができる点です。

きっかけとなる動作を選択すると、今度はその動作をしたとき、どのようなアクションを端末にさせるかを選ぶ画面が出てきます。

こちらもトリガーと同様にかなりたくさんの種類から選ぶことができます。
電源のON/OFFなど、中にはroot化しないと使えないメニューもありますが、root化していなくても大半のものは選ぶことができます。

かなり細かい設定ができますので、いろんなところで威力を発揮しそうです。

例えば、こんな使い方もできます。

指定された回数スマホロックの解除に失敗したら…

 

写真を撮らせる、という指定もできます。
盗難防止対策にもなりそうですね。

Androidをナビ化する際にはシガーライターから電源供給が途絶えたときに自動でディスプレイをOFFにさせたり、BluetoothやWi-FIを停止させたりなどで使っています。

無料版はタスクを5つまでしか登録できませんが、それでも十分の威力です。

気になった方は是非端末にインストールして試してみてはいかがでしょうか。

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

【Android】カスタムデザインのListViewを表示する

Android の ListView は、昔作成したことがあるのですが、いかんせん昔過ぎてほとんど忘れていたので備忘録もかねてまとめ。
ちなみに、すでに用意されているレイアウトを使うのではなく、リストアイテムのレイアウトからカスタムする方法です。

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

Androidでリストビュー(ListView)をカスタムして表示する – Qiita
https://qiita.com/ksugawara61/items/2d63f0be279a94b74550

 

早速実装!
まず、作成するファイルの一覧は下記のとおりです。
・MainActivity.java
・activity_main.xml
・list_item.xml
・ListItem.java
・ListAdapter.java

MainActivity.java に追加するコードは下記のとおり。

ListItem item = new ListItem();
// item にデータ追加処理を行う

ListView listView = findViewById([ListViewのID]);
ListAdapter adapter = new ListAdapter(this, R.layout.list_item, item);
listView.setAdapter(adapter);
listView.setOnItemClickListener((adapterView, view, position, l) -> {
    // ListViewのアイテムクリック時の処理
});

activity_main.xml ファイルには、ListView を追加します。

<ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/[ListViewのID]" />

ListItem.java には、ListView で使う値を扱えるクラスを定義します。

public class ListItem {
    private String entry_title;
    private String adate;
    private String url;

    public EntryListItem() {};

    public EntryListItem(String e_entry_title, String e_adate, String e_url) {
        entry_title = e_entry_title;
        adate = e_adate;
        url = e_url;
    }

    public void setEntryTitle(String title) {
        entry_title = title;
    }

    public void setAdate(String e_adate) {
        adate = e_adate;
    }

    public void setUrl(String e_url) {
        url = e_url;
    }

    public String getEntryTitle() {
        return entry_title;
    }

    public String getAdate() {
        return adate;
    }

    public String getUrl() {
        return url;
    }
}

ブログ記事を扱うことを想定しているので、それらの値が格納されるようになっています。
値の格納と取得を行うための関数も定義しています。

ListAdapter.java は、ArrayAdapter を継承していて、上の ListItem.java クラスを利用するためのクラスです。

public class ListAdapter extends ArrayAdapter<ListItem> {

    private int mResource;
    private List<ListItem> mItems;
    private LayoutInflater mInflater;

    public EntryListAdapter(Context context, int resource, List<ListItem> items) {
        super(context, resource, items);

        mResource = resource;
        mItems = items;
        mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;

        if (convertView != null) {
            view = convertView;
        }
        else {
            view = mInflater.inflate(mResource, null);
        }

        // リストビューに表示する要素を取得
        ListItem item = mItems.get(position);

        // タイトル、投稿日時を設定
        TextView title = view.findViewById(R.id.title);
        title.setText(item.getEntryTitle());
        TextView adate = view.findViewById(R.id.adate);
        adate.setText(item.getAdate());

        return view;
    }
}

ListView にセットする Adapter がこのクラスです。

 

以上のコードとファイルを作成すると、カスタマイズされた ListView を実装することができます。
覚え書きのため、かなり簡単なまとめになっているので、もっと詳しく知りたい方は、最初に紹介した参考サイトを読んでください。

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