カテゴリーアーカイブ Android

村上 著者:村上

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

【Android】「Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above.」の対処法

今回も、Android Studioでアプリを開発中に遭遇したエラーについてです。
最近、何だかエラー遭遇率が妙に高い気が…。
特に、変なところをいじってはいないはずなので、気のせいだと良いのですが。

さて、今回のエラーはこちら。

Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above.

先日まで動いていはずなのですが、今日起動してビルドしようとしたところ、上記のようなエラーが出ました。
こちらをGoogle翻訳に掛けた結果は、「Gradleバージョン4.6以上を使用しているため、Android Gradleプラグインの現在のバージョンではオンデマンドでの設定はサポートされていません。」とのこと。
どうやらサポートされてない設定を使っているようでした。
…なぜ急に?

 

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

Configuration on demand is not supported by the current version of the Android Gradle plugin – Stack Overflow
https://stackoverflow.com/questions/49990933/configuration-on-demand-is-not-supported-by-the-current-version-of-the-android-g

この記事によると、まず、gradle.properties で指定している「org.gradle.configureondemand」という記述を削除します。
が、上記に該当する記述は見つからず…一旦、置いておくことに。

そして次に、Setting から、Build, Execution, Deployment > Compiler を開きます。

そうすると、下の方に「Configure on Demand」という箇所があるので、ここのチェックを外します。
上の画像だと、赤枠で囲っている場所です。
あとは、Apply を押してから、OKを押せば設定は完了です。
その後、いつも通りビルドを行ったところ、問題なくビルドが成功し、無事にアプリも実行できました。

 

以上、「Configuration on demand is not supported by the current version of the Android Gradle plugin since you are using Gradle version 4.6 or above.」エラーの対処法でした。
エラー文だけでは意味が分からなかったのですが、案外あっさりと解決できたので良かったです。
自分が書いたコード以外のところでエラーが出ると若干ヒヤッとしますね…。
もし同じエラーでお困りの方がいらっしゃいましたら、参考にしていただければと思います。

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

【Android】「error: resource android:attr/fontVariationSettings not found.」の対処法

今回もAndroidをビルドした際のエラーについて。
最初、ログには「AAPT2 error」としか表示されなかったので、全く意味が分からなかったのですが、詳細を表示したところ、「error: resource android:attr/fontVariationSettings not found.」とのエラーだということが分かりました。
こちらのエラー文によると、「android:attr/fontVariationSettings」というリソースが見つからないという事でしたが、そもそもそんな場所を触った記憶もなく…。

 

で、エラー文で検索をかけたところ、こちらの記事が参考になりました。

android studio 3.0.1 で AAPT2 error が出た時の対応 – Qiita
https://qiita.com/kako351/items/7775157358aaf00da6f9

こちらの記事によると、アプリの build.gradle に、下記を追加して再ビルドすれば良いとのことでした。

configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.0.2'
    }
}

試したところ、私の環境でも問題なくビルドが成功しました!

他にも、gradle.properties ファイルに、下記を追加するという方法もあるようでしたが、投稿者の環境ではこの方法では解決しなかったとのことです。

android.enableAapt2=false

たしか、私の環境でも、こちらは意味がなかったような記憶があります。

なので、まずは build.gradle への記述をお試しすることをおすすめします。

 

以上、Android Studio のエラー「error: resource android:attr/fontVariationSettings not found.」の対処法でした。
なお、エラーログに具体的なエラー内容を表示させる方法については、こちらの記事を参考にしてください。

【Android Studio】「Compilation failed to complete」エラーの対処法
https://cpoint-lab.co.jp/article/201809/【android-studio】「compilation-failed-to-complete」エラーの対処法/

Android Studioのエラーって、たまに良く分からないものとかがあったりするので、こうして詳細を表示するように設定しておくと、エラーの種類よっては原因が分かったりすることもあります。

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

【Android】「No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel-linux-android」エラーの対処法

タイトルにある通り、Android Studioで発生したエラーの対処法についてです。
エラー文はこちら。

No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel-linux-android

NDKツールチェーンフォルダに必要なファイルが足りないことが原因のようでした。

 

今回エラー解消で参考にさせていただいた投稿はこちらから。

“No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android”・Issues #15・google/filament・GitHub
https://github.com/google/filament/issues/15

この中に、AndroidのDeveloperサイトから、NDKをダウンロードしてきて、それを適切な場所に置く、という対処法があり、こちらを行いました。

まず、下記から自分の環境に対応したパッケージをダウンロードします。

NDK のダウンロード|Android NDK|Android Developers
https://developer.android.com/ndk/downloads/?hl=zh-en


私の場合は、「Windows 64 ビット」のパッケージをインストールしました。
ただ、サイズが 700MB くらいあるので、少し時間がかかります。
ダウンロードが完了したら展開しておきましょう。

次に、Android SDKのある場所を開きます。
私のWindows環境では、C:\Users\[ユーザー名]\AppData\Local\Android\sdk でした。
そこにある ndk-bundle フォルダの中の、さらに toolchains フォルダを開きます。

そのフォルダ内に、mips64el-linux-android-4.9mipsel-linux-android-4.9 が足りていなかったため、ダウンロード・展開をしたファイルからその2つをコピーします。

あとは、Android Studio に戻って、再ビルド(もしくは Try Again)を実行します。
私の場合は、これでビルドが完了しました。

 

以上、「No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel-linux-android」というエラーの対処法でした。
こういう、ファイルが足りない系のエラーって面倒ですね…。
が、何とか解決できてよかったです。
もし同じ状況に陥った場合は、是非参考にしてみてください。

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

【Corodva】Android端末で実行した時に変更内容が反映されない時の対処法

昨日投稿した 【Android】Create React AppとCorodvaで作成したAndroidアプリにプラグインが追加できない時の対処法 の内容とも少し関わってくるのですが、Create React AppとCorodvaで作成したアプリが、何故かAndroidでだけ変更内容が反映されないという状況に陥ったので、その対処法についてです。
この現状が起こるのはAndroidだけで、BrowserとiOSについては何の問題もなく、変更内容が反映されていて…。
原因が分からず、かなり苦しめられました。

 

さて、解決方法ですが、何てことはなく、単にパッケージもしくはプラットフォームのバージョンが新しすぎたせいでした。
今回、アプリの環境をつくるにあたり、Cordovaのバージョンを 7.1.0 から 8.0.0 にアップデートしたのですが、それが原因のようです。
もしくは、Android自体のバージョンが高すぎたのかもしれませんが…とにかく、バージョンが新しすぎて、Androidのファイルが正しく作られていませんでした。
そのため、cordova buildなどの Cordovaのコマンドが正常に働いていなかったのかもしれませんが…エラーが表示されなかったので、発見がかなり遅くなりました。
バージョンに思い至ったのも偶然だったので、もしかしたらこれ以上に解決まで時間が可能性もあり…ぞっとしませんね。

ということで、Cordovaのバージョンを、以前と同じ 7.1.0 に戻したところ、あっけなく変更箇所がアプリに反映されました。
さらに、昨日紹介したプラグインが正常にインストールされない問題についても、バージョンを下げてプラットフォームを再インストールしたところ、必要なファイルが正常に作成されたため、特に修正する必要もなくインストールに成功しました。
…容易にバージョンを上げないようにしなければ…!

 

以上、Cordovaで変更した内容が反映されないときの対処法でした。
とりあえずは、パッケージのバージョンは容易に上げないようにすべきですね…。
古すぎるのもまずいとは思いますが、新しすぎでも問題のようですので、最新より1つ下のバージョンくらいがちょうどいいのかもしれません。
皆様もバージョンによる不具合には十分お気を付けください。

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

【Android】Create React AppとCorodvaで作成したAndroidアプリにプラグインが追加できない時の対処法

長いタイトルですが、本日これが起こったので、自分のための備忘録として対処法をまとめます。

開発環境は、Create React App と Cordovaを使っています。
こちらについては、下記の記事のとおりに作成しましたので、ご参考ください。

Create React App & Cordovaでアプリをつくる環境を整える 2018年4月時点 – Qiita
https://qiita.com/bathtimefish/items/113154e89650b351b5b7

 

さて、本題のプラグインの追加ですが、まず追加したいプラグインは下記の2つです。

・https://github.com/petermetz/cordova-plugin-ibeacon
・https://www.npmjs.com/package/cordova-plugin-bluetooth-serial

が、この2つを追加したところ、cordova build android が動かなくなる状況に…!

エラー文によると、androidディレクトリ以下の ressrc、そして AndroidManifest.xml が何故かつくられていないことが原因でした。
そのため、対処法としてはまず一旦プラグインを削除し、Androidのプラットフォームを削除・再作成を行いました。

で、その時点でビルドを行い、正常にビルドが完了するかを確認しました。
この時点では問題なかったのですが、エクスプローラでファイルを確認してみると、やはり res、src、AndroidManifest.xml がない…。
なので、他のCordovaの環境から、上記ファイルをコピー&ペーストして、package名や、ディレクトリ構造をコピー先の環境に合わせるというアナログな手法を取ってみました。
その後、再度プラグインを入れ直したところ、どうやら正常にインストールできた模様。
そして、最後に再度ビルドを行いましたが、今度は正常に完了しました!
試しに実機を接続して、cordova run androidを実行してみましたが、こちらも正常に実行され、問題なくアプリが起動しました!

 

ということで、凄くアナログな方法ではありますが、この方法で何とか無事にプラグインの導入が完了しました!
…アナログだろうが動けばいいんです…!
もし同じようなヵ所でお困りの方がいらっしゃいましたら、良ければ参考にしてください。

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