カテゴリーアーカイブ Android

村上 著者:村上

【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)
takahashi 著者:takahashi

いろんなタイミングに合わせて自動でアプリの起動や音楽の再生を行ってくれる”SmartConnect”

XperiaのバンドルアプリでもあるSmartConnectというアプリですが、バンドルされているにも関わらず、一回も起動したことがありませんでした。

ところが、最近タブレットをカーナビ化する際にめちゃくちゃ便利なことに気づきました。
…使ったのはXperiaではなくNexus7ですが…w

今回は、こちらのSmartConnectというアプリをご紹介したいと思います。


こちらが起動直後の画面です。
Sony製のアプリは、説明と一緒に画像が入っているものが多くて、とても分かりやすい印象です。

まず、最初の画面では何かを自動で作業させる際の”きっかけ”になるものを指定します。

何かのアクセサリ(Bluetooth機器やヘッドフォンなど)を接続したとき、または時間で指定することができます。

アクセサリ、または時間を指定し、次に進むと、先ほどの画面で指定した条件を満たしたときに行う動作を指定する画面が出てきます。

Xperia版の場合はこれだけの項目から動作を選ぶことができます。
Playstore版の方はもう少し項目が少ない気がしたので、Xperia版と比べると制限があるのかもしれません。

開始時(例えば機器との接続時)と終了時(例えば機器との切断時)のそれぞれの動作を指定することができます。
例えば、機器に接続されたら音楽を再生、切断されたら音楽を停止、のような設定ができます。

一通りの動作の流れを指定したら、確認画面が出てきます。

ここで今回設定した動作に名前を付けることができます。


つけた名前は一覧に表示されます。
動作の有効・無効もこの画面からも切り替えることができます。

長押しすると

画像の変更もすることができます。

全体の設定では動作時の通知やバイブレーションの設定、読み上げのon/offができます。

メーカー製アプリですが、かなり強力な自動操作機能がついていてとても便利です。
特にXperiaユーザーの方はプリインストールされているかと思いますので、スマホを自動操作させたい場面がある方は是非一度お試しください。

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

Nexus7(2012)を充電時に自動でOSを起動するようにしてみた

最近、使ってなくてほこりをかぶっていたタブレット…Nexus7の2012年モデルを、車のナビ専用端末に仕立てようといろいろセットアップしていたのですが、車のナビにする以上、エンジンと連動して起動したり、停止したりしてほしいのですが、元々汎用用途であるAndroidタブレットだとなかなかその挙動が難しかったりします。

SmartConnectというアプリを使うと何かの”きっかけ”(例えばイヤホンケーブルにつないだ時、とか、充電機器に接続したとき、とか)をもとにして自動でアクションをさせられるので、OS起動後にBluetooth機器に接続されたときなどにナビアプリの自動起動と音楽の再生、接続が切れた時(=エンジンを切ったとき)にホームへの移行や、音楽の停止などを行わせる所まではできたのですが、唯一タブレットの電源onについてはOSが起動する前の挙動なので、アプリではなかなか変更が難しいところです。

ただ、出かける前にタブレットを台に乗せてケーブルをつないで、さらに電源もONにするとなると、埋め込み型のナビと比較してかなりめんどくさいので、何か一つだけでも自動化できないかといろいろ調べていたところ、こちらの記事を発見。

nexus7で充電開始時に自動で電源オンにする設定(root不要)- hycko.blog

root化不要でこんな設定ができただと…
なんでもブートローダーの設定をPC(ADB)経由で変更してやることで、充電専用ケーブル・通信用ケーブル関係なく充電器と接続した時点でAndroidが自動起動してくれるようになるとのこと。

…でも、ブートローダーなんてroot化やROM焼きなんかに出てくるあれだよね…そんな簡単に触れるもんなのか…と疑心暗鬼になりながらも、とりあえず試してみましたところ….

想像以上に簡単でした\(^q^)/

(※写真はNexus7 2013ですが、実際はNexus7 2012で検証しました。なお、Nexus7 2013もブートローダーの起動までは同じ手順でできました。)

簡単に手順をまとめると、下記のようになります。(※メーカーの修理を受けれなくなる可能性のある内容です。試される場合は自己責任の下行ってください。)

1.Androidの設定->開発者ツールから、USBデバッグを有効にします。
(※開発者ツールはデフォルトでは非表示になっています。こちらの方法で開発者ツールを表示させてください。)
2.PCにUSBで接続し、次のコマンドを実行します。(Android Studioをあらかじめインストールしている必要があります。)

adb reboot bootloader

Nexus7が再起動して、ドロイドくんのおなかの蓋があいている絵のある画面が出てきます。

これが”ブートローダー画面”のようです。
この画面が出てきたら、次のコマンドを入力します。

fastboot oem off-mode-charge 0

すると自動でNexus7が再起動され、いつも通りAndroidが立ち上がります。
Androidの起動が完了したら、一旦USBケーブルを抜いた状態で電源を切り、充電専用のUSBケーブルで充電器とNexus7をつないでみます。

すると、電源ボタンを押さなくても電源が自動で入るようになりました!
なお、再び充電専用ケーブルと充電器をつないでも起動しないようにするには

fastboot oem off-mode-charge 1

とすればよいようです。

自分はもう使わなくなったタブレットを再利用してるので設定変更を行いましたが、簡単にできるとはいえ通常はブートローダーの設定を変更すること自体かなりリスキーな作業になります。
お手元のNexus7(2012)で試される際は自己責任のもと、慎重に行っていただきますようお願いします。
(ブートローダーの起動自体は他のAndroid端末でも行えるかもしれませんが、設定の変更については正常にできる保証はない(機種によってはメーカーがブロックしている可能性がある)ので、確証がない限り試さないことをお勧めします。)

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

【Android】「The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.」エラー【未解決】

タイトル通り未解決のAndroid Studioのエラーについてです。
いくつかヒットした解決策を試したのですが解消されず…。

エラーはこちら。

The minSdk version should not be declared in the android manifest file. You can move the version from the manifest to the defaultConfig in the build.gradle file.

minSdk の指定を AndroidManifest.xml ではなく build.gradle で指定するようにという内容です。
なので、この指示通りに minSdkVersion を build.gradle に書き直したのですが…それでも解消せず。

記述箇所はこのような感じです。

android {
  ...
  defaultConfig {
    ...
    minSdkVersion 14
    targetSdkVersion 24
  }
  productFlavors {
    main {
      ...
    }
    afterLollipop {
      ...
      minSdkVersion 21
    }
  }
}

ちなみに、この内容は Android Developers のページを参考にしました。

アプリのバージョニング|Android Developers
https://developer.android.com/studio/publish/versioning?hl=ja

Cordova で作成した環境だから、というのもありそうですが、まだわかってはいません。
また、このエラーがあっても別にビルドや実機での実行は試すことができるので、今のところ、一旦放置しています。
が、ずっとウィンドウ上部に「Try Again」が表示されているのもうっとおしいので、早めに解決したいところですね。

 

解決策が判明したら、改めてご紹介したいと思います!

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

【Android】HTTP Clientの「OkHttp」でAPIを実行する

タイトル通り、Androidアプリで APIを使う方法についてです。
今回は「OkHttp」という HTTP Client を使っています。

参考にさせていただいた記事はこちらから。

OkHttp(基本的なGET・POST) – Qiita
https://qiita.com/naoi/items/8d493f00b0bbbf8a666c

 

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

String url = [APIのURL];
Request request = new Request.Builder().
        url(url).
        build();

OkHttpClient client = new OkHttpClient();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Request request, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Response response) throws IOException {
        Log.d("Response", response.body().string());
    }
});

こちらはGETの場合の記述方法です。
データの取得は非同期で行っています。
同期処理も行えるようですが、私の環境では実行時にエラーで落ちたので、使用していません。

こちらはPOST処理の場合。

String url = [APIのURL];
MediaType MIMEType = MediaType.parse("application/json; charset=utf-8");

RequestBody requestBody = RequestBody.create(MIMEType, [送信するdata]);
Request request = new Request.Builder().
        url(url).
        post(requestBody).
        build();

OkHttpClient client = new OkHttpClient();

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Request request, IOException e) {
        e.printStackTrace();
    }

    @Override
    public void onResponse(Response response) throws IOException {
        Log.d("Response", response.body().string());
    }
});

GET処理とほぼ同じですね。
違うのは、5行目からの Request の箇所です。
こちらも非同期で処理を行うように記述しています。

 

が、ここで問題が。
記述が間違っているのか、POST処理で Data がうまく渡せません…。
JSONで記述しているのですが、どうしても渡しているはずのデータが受け取れず。
現在調査中ですが…早く直してしまいたいところです。
解決策が見つけられたら、またご紹介したいと思います!

以上、Androidアプリで API を実行するためのHTTP Client「OkHttp」についてのご紹介でした。

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

【Android】「Only the original thread that created a view hierarchy can touch its views.」の対処法

今日の記事は、Androidアプリ開発中に遭遇したエラーについてです。
修正はそこまで大変ではなかったのですが、使用頻度が低く、忘れそうだったので備忘録としてまとめます。

エラーは「Only the original thread that created a view hierarchy can touch its views.」というもので、こちらはメインスレッド以外で、TextView などの UI を変更しようとすると発生するエラーです。
シンタックスエラーとは違い、ビルドは通ってしまうので要注意ですね。

 

では、早速対処法についてご紹介。
今回参考にさせていただいたサイトはこちらです。

メインスレッド以外でUIを変更する方法 – Accele Biz IT開発技術 調査報告書
http://accelebiz.hatenablog.com/entry/2016/09/01/061934

エラーが発生したコードはこちら。

TextView textView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    textView = findViewById(R.id.[ID名]);
    showMessage();
}

private void showMessage(){
    try {
        /* 処理 */
        textView.setText("[表示したい文字列]");
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

一部改変していますが、だいたいこんな感じ。
で、問題は、showMessage() 内の try/catch で指定した、setText() です。
やった事がなかったので知らなかったのですが、このようにメインスレッド以外で UI を操作することはできないようでした。

ですが、対処法もちゃんと用意されていました。
参考サイトそのままですが、Handler を使用して、別スレッドからメインスレッドに処理を依頼する方法です。
具体的には下記のとおりです。

private void showMessage(){
    final Handler mainHandler = new Handler(Looper.getMainLooper());
    try {
        /* 処理 */
        mainHandler.post(() -> {
            textView.setText("[表示したい文字列]");
        });
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

2行目に Handler を宣言し、TextView の操作の記述を mainHandler.post() で囲うだけです。
これを追加したところ、問題なく TextView の操作を行うことができました。

 

以上、TextView などの UI の操作をメインスレッド以外から行う方法でした。
今回の解決策は、例えば何らかの処理を別スレッド&非同期で行っていて、結果が返ってきたタイミングで UI を変更したい、等の場合にも使えるかと思います。
もし、同じエラーでお困りの場合は、是非参考にしていただければと思います。

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

【cordova-react】プラグインについての豆情報(二つあります)

今日はお題は二つの小ネタです。一つ目はcameraプラグインについてです。

 

cordova-camera-pluginとphonegap-camera-pluginはコルドバでカメラを使うことができるプラグインです。

自分のファイルの中にこの両方が入っており、どちらか消しても問題ないだろうと思いcordova-camera-pluginを削除したのですが

動かなくなりました。慌てて入れ直すとあっさりと元通り。なんでニコイチやねんと思いました。

米国のサイトまでいって調べたのですが、原因は分からずじまいです。

 

二つ目はプラグインを入れるタイミングの話です。

cordova platform rm androidした後にプラグインを入れてadd platformすると下記の画像のように怒られます。

原因は確信ではないのですが、直前に入れたプラグインを記憶できないためだと思われます。

なので必ず新しいplatformを入れてからプラグインを導入してくださいね、という感じです。赤文字は怖いですが大抵グレイドルか

プラグイン関係なので恐れることはないと思います。

以上小ネタでした。

 

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

ついにPixel 3/Pixel 3 XL の日本発売が正式に発表!

ついに…

ついに!!!

Pixel 3/3 XL 正式発表キタ――――――――――――――――――――――(゚∀゚)――――――――――――――――――――――!!

Google Pixel 3 公式ティザーサイト

いやぁ来ましたね。

Pixel 3はAndroid開発元のGoogle自身が開発したAndroid端末の最新機種です。
見た目はGoogleのロゴが入っていること以外普通のスマートフォンなのですが、実は他のAndroidスマートフォンにはない特徴があります。

1.”Android OS開発元”のGoogleが直接ビルドした”純正のAndroid”が使える。

以前販売されていた”Nexus”シリーズ同様に開発元のGoogleが混ざりけなしのAndroidをインストールしているため、メーカーやキャリア製端末によくある”消せないアプリ”が最小限になっています。
また、メーカーによるAndroidの改造プロセスがない分Android最新版が出た時点でGoogleから直接アップデートを受け取れるため、ほかのAndroidスマホよりも早く新しいOSのバージョンが試せるのも魅力です。

2.Googleの最新機能がいち早く使える

Googleが作ったソフトウェアがそのまま入っているので、Googleが提供する新機能もいち早く試せます。
過去に、先代のPixel2に優先的に搭載された機能として、Googleアシスタント、GoogleLensなどがあります。
また、今回のPixel 3発売とともに、Googleアシスタントがユーザーの代わりに電話に応答し、迷惑電話を撃退してくれる機能も発表されました。

今後新たな機能の発表があった際も、(HWが対応していれば)Pixel 3にも優先的に提供されるとみられます。

3.カメラ性能
背面カメラは12.2 メガピクセルとSonyのXPeriaシリーズよりは劣りますが、光学ズームを搭載しており、Googleの得意分野であるAIを使用した強力な画像補正技術により、非常に綺麗な写真を撮ることができるとのこと。

また、暗いところでも綺麗に撮れるNight Sight機能、
シャッターチャンスを逃してしまっても、シャッターの前後の写真から一番良いものを後から選べる機能など、アマ以上のカメラマンも垂涎の機能がたくさん盛り込まれています。

今回の発表が特に盛り上がった理由として、こういった機能面だけではなく、日本発売が絶望視されてきたPixelシリーズの端末の日本国内発売がされた点があります。
以前の記事でも説明しましたが、日本ではNexusシリーズを最後に、Google純正の端末がしばらく発売されてきませんでした。

その分、久々の純正端末の発売決定は反響が特に大きかったようです。

最近発売されたiPhone XS/XR と単純に比較すると微妙なところではありますが、Google・Androidファンにとってはかなり魅力的な一台なのではないかなと思います。

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

【Android】Mapboxで表示した地図の中心を変更する方法

昨日の予告通り、今回はMapboxの地図の中心位置を変更する方法についてです。
前回の記事については、下記から確認頂けます。

【Android】Mapboxを使って地図上にピンを立てる方法
https://cpoint-lab.co.jp/article/201810/【android】mapboxを使って地図上にピンを立てる方法/

 

では早速実装方法について。
なお、今回のコードは Mapbox が導入済みであることを前提に進めています。

まず onCreate() 内に、下記のコードを追加します。

mapView.getMapAsync(this);

ちなみに、この時、Android Studioでは、this の部分がエラーになり、赤い波下線が引かれますので、そこにカーソルを合わせて Alt + Enter を押します。
表示される対処法の項目中に、OnMapReadyCallbackimplements するというような内容の候補があるので、こちらを選択します。
すると、onMapReady() という関数がオーバーライドされるので、その中に下記のコードを追加します。

@Override
public void onMapReady(MapboxMap mapboxMap) {
    CameraPosition position = new CameraPosition.Builder()
            .target(new LatLng(lat, lng)) // Sets the new camera position
            .zoom(11) // Sets the zoom to level 10
            .tilt(0) // Set the camera tilt to 0 degrees
            .build(); // Builds the CameraPosition object from the builder

    mapboxMap.animateCamera(CameraUpdateFactory.newCameraPosition(position), 1000);
}

ズームレベルや、傾きなどは適宜変更してください。
こちらを実行すると、起動後、カメラの位置が上記で指定した位置が中心になるように移動します。
処理としては以上で完了です。

 

意外と回りくどい方法だな…と思うのは私だけでしょうか…?
レイアウトファイルのXMLでは、地図の初期位置を簡単に指定できるので、コード上でも簡単にできてほしいですね。
ですが、意図していたことは実現できたので問題なし!
もし、同じことに取り組んでいる方は、参考にしていただければと思います。

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

【Android】Mapboxを使って地図上にピンを立てる方法

今回は、Mapboxを使って、Androidアプリで地図を表示する方法について。
導入は簡単でしたので、今回はそれプラス、地図にマップピンを立てたいと思います。

導入は本家サイトをご参考ください。
なお、マップの表示にはアクセストークンが必要なため、ユーザー登録を行ってください。

Install Maps SDK for android|Mapbox
https://www.mapbox.com/install/android/

上記で紹介している手順通りにSDKの導入やPermissionの設定、MapViewの指定を行えば、問題なく地図が表示できるはずです。
で、地図が表示されたら、いよいよマップピン表示!

コードは下記のとおりです。
重複している箇所があるので、必要なところのみコピー&ペーストしてください。

private MapView mapView;
private MapboxMap mapboxMap;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Mapbox.getInstance(this, "[access_token]");
    setContentView(R.layout.activity_map);

    mapView = findViewById(R.id.mapView);
    mapView.onCreate(savedInstanceState);
    mapView.getMapAsync(this);

    Double lng = [緯度];
    Double lat = [経度];
    mapView.getMapAsync(mapboxMap -> mapboxMap.addMarker(new MarkerOptions()
            .position(new LatLng(lat, lng))
            .title("写真を撮影した場所")));
}

こちらを実行すると、下の写真のようにマップピンが地図上に表示されます。

会社で撮影した写真の位置情報を使用したので、若干の誤差はあれど、ほぼあっていますね!

 

以上、地図上にピンを立てる方法でした。
しかしこれだけだと、マップの中心位置≠マップピンが立っている場所、なので、マップの中心位置やピンの場所によっては、地図をかなりスワイプしたりドラッグする必要がある場合があります。
次回は、こちらを解消すべく、地図の中心位置をコード上で操作する方法についてご紹介できればと思います。

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