カテゴリーアーカイブ Android

村上 著者:村上

【Android】画像のExif情報から緯度・経度を取得する方法

先日ご紹介した、写真のExif情報から写真の向きを取得する方法に続き、今回は位置情報を取得する方法についてです。
なお今回も、「ExifInterface」というライブラリを使っています。

ちなみに、以前紹介した写真の向きの取得方法についてはこちらの記事から。

【Android】写真のExif情報から写真の向きを取得する方法
https://cpoint-lab.co.jp/article/201809/【android】写真のexif情報から写真の向きを取得する方法

 

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

// 写真から緯度経度を取得
File f = new File([画像のファイルパス]);
Uri uri = Uri.fromFile(f);
InputStream in = null;
try {
    in = getContentResolver().openInputStream(uri);
    ExifInterface exifInterface = null;
    if (in != null) {
        exifInterface = new ExifInterface(in);
        String latitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
        String longitude = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
        String latitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
        String longitudeRef = exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
        // 緯度経度の値を変換
        Double lat = ExifLatitudeToDegrees(latitudeRef, latitude);
        Double lng = ExifLongitudeToDegrees(longitudeRef, longitude);
    }
} catch (IOException e) {
    e.getStackTrace();
    Log.e("ExifActivity", e.getMessage());
}

取得できた緯度経度は、それぞれ lat変数、lng変数に代入されています。
が、この関数では、緯度経度が度分秒という60進数で表現されています。
そのため、場合によってはこの値を10進数に変換する必要があります。

変換はこちらの関数を使いました。
参考サイトのURLをメモしておくのを忘れてしまいました…。
第一引数に、北緯・南緯、もしくは東経・西経を指定し、第二引数に緯度もしくは経度の値を指定します。
上のコードでは、11行目と12行目でそれぞれ緯度経度を変換しています。

// 60進数を10進数に変換
private double ExifHourMinSecToDegrees(String exifhourminsec) {
    String hourminsec[] = exifhourminsec.split(",",0);
    String hour[] = hourminsec[0].split("/",0);
    String min[] = hourminsec[1].split("/",0);
    String sec[] = hourminsec[2].split("/",0);

    double dhour = (double)Integer.parseInt(hour[0]) / (double)Integer.parseInt(hour[1]);
    double dmin = (double)Integer.parseInt(min[0]) / (double)Integer.parseInt(min[1]);
    double dsec = (double)Integer.parseInt(sec[0]) / (double)Integer.parseInt(sec[1]);
    double degrees = dhour + dmin / 60.0 + dsec / 3600.0;

    return degrees;
}

// 緯度の変換
private double ExifLatitudeToDegrees(String ref, String latitude) {
    return ref.equals("S") ? -1.0 : 1.0 * ExifHourMinSecToDegrees(latitude);
}

// 経度の変換
private double ExifLongitudeToDegrees(String ref, String longitude) {
    return ref.equals("W") ? -1.0 : 1.0 * ExifHourMinSecToDegrees(longitude);
}

 

以上、写真から位置情報を取得する方法でした。
なお、当然ですがExifに位置情報が保存されていなければ取得できません。
その場合は、現在の位置情報を取得するなり、もしくは「位置情報を取得できませんでした」というメッセージを取得するなどの処理を追加するほうが良さそうですね。
このあたりはお好みで実装してください。

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

【Android】写真のExif情報から写真の向きを取得する方法

タイトル通り、今回は写真の Exif 情報を取得する方法についてです。
ちなみに Exifとは、デジカメやスマートフォンで撮影した画像データに、撮影条件に関するメタデータを追加して保存できる、画像ファイル形式の規格のことをいいます。
例えば、撮影日時とかカメラの機種、カメラの向きなどが保存されています。

で、AndroidでExifを扱うときには、ExifInterface というサポートライブラリを利用します。

Android Developers Blog: Introducing the ExifInterface Support Library
https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html

 

さて、使い方ですが、まず build.gradle に下記を追加します。

implementation "com.android.support:exifinterface:26.1.0"

追加する場所は dependencies{} の中です。
build.gradle を変更すると、Sync Now というリンクが表示されるので、これをクリックします。
エラーが表示されなければ、無事にライブラリが追加できました。

あとは、Activityにコードを追加してきます。

File f = new File([画像のファイルパス]);
Uri uri = Uri.fromFile(f);
int orientation = 1;
InputStream in = null;
try {
    in = getContentResolver().openInputStream(uri);
    ExifInterface exifInterface = null;
    if (in != null) {
        exifInterface = new ExifInterface(in);
        orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
    }
} catch (IOException e) {
    e.getStackTrace();
    Log.e("ExifActivity", e.getMessage());
} finally {
    if (in != null) {
        try {
            in.close();
        } catch (IOException ignored) {
        }
    }
}

結果は orientation という変数に入ります。
もし正常だったら 1 の値が入りますが、左に90度回転していた場合は 6 が、右に90度回転していた場合は 8 が、180度回転していた場合は 3 が入ります。
これに関しては、下記の記事を参考にしました。

iPhoneからアップロードしたJPEG写真が横向きになる問題(EXIF, Orientation)
https://qiita.com/RichardImaokaJP/items/385beb77eb39243e50a6

 

画像の回転については、以前紹介したこちらの記事を参考にしてください。
【Android】ImageViewの画像を180度回転させる方法
https://cpoint-lab.co.jp/article/201809/【android】imageviewの画像を180度回転させる方法/

 

以上、Exifから画像の向きを取得する方法でした。
次回は、位置情報の取得について説明できたらと思います。

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

【アプリ】写真加工機能を手軽に実装できる「Adobe Creative SDK」

まだAndroidに導入途中なので、詳しい実装方法はご紹介できないのですが、まずはこんな便利なサービスがあるというご紹介まで。

写真にフィルターをかけたり、スタンプを押したりできる無料のSDKが、Adobeから提供されています。
サービス名は、タイトルにある通り「Adobe Creative SDK」です。
公式サイトはこちらから。
Adobe Creative SDK
https://www.adobe.io/apis/creativecloud/creativesdk.html
Androidだけでなく、iOSやWebにも対応しています。
Web版だけは試したことがありますが、とても簡単でした!

なお、こちらの記事も参考になりますので、ぜひご覧ください。
https://qiita.com/84d010m08/items/566415df1914ca097082
https://qiita.com/84d010m08/items/566415df1914ca097082

 

こちらのサービスを使うにはアカウント登録とアプリ登録が必要なので、今回はそちらをご紹介。
まずAdobeアカウントを、Adobeの公式サイト右上のログインから作成してください。

アドビ公式サイト:クリエイティブ、マーケティング、文書管理ソリューション
https://www.adobe.com/jp/

アカウントがすでにある人は、ログインしてください。

ログインで来たら、下記からコンソールに移動します。

Adobe I/O Console
https://console.adobe.io/integrations

そのページに「New Integration」というボタンがあるので、そこから新規のアプリを登録します。
なお、アプリ名などは後で変更できますので、ご安心を。
ちなみに、この登録だけではアプリストアでの公開ができないらしいので、テスト用ならOKですが、のちのち公開するなら審査を通してください。
この作業についても、このコンソール画面からできます。
スクリーンショットをとる手間などはありますが、審査自体は思ったよりもすんなり通りましたね。

 

各プラットフォームごとの導入方法については、下記のドキュメントを参考にしてください。

Documentation
https://www.adobe.io/apis/creativecloud/creativesdk/docs.html

 

以上、簡単ですが、Adobe Creative SDK についてでした。
Androidに導入が完了しましたら、改めて手順をまとめたいと思います。

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

【cordova】unable to load platformAPIでブラウザが開けなかった時の解決法

今回は再びコルドバの話題に戻ります。

先日cordovaを7.0.1から8.0.0にアップデートした時のことです。

直後にブラウザで動きを試したいと思い、いつものようにコマンドでnpm run serveでブラウザを実行したところ、下記のエラーが出現しました。

コルドバのバージョンをcordova.jsやモジュールにも認識させないといけなかったみたいです。

browserのplatformを入れ直したところ一発で解決しました。

一旦rmで消して↓


cordova platform rm browser

addで追加します


cordova platform add browser

ちなみに他のplatformを消す必要はないのでそこは大丈夫です。

一応このエラーの解決はしましたが、以前chromeで開けてたアプリがIEで表示されるようになってしまいました。原因は調査中です。

解決方法が見つかり次第このブログに書いていきたいと思います。

 

 

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

“純正Android端末”なGoogle Pixelシリーズ、ついに日本での発売が決定!!!

今朝、突然のビッグニュースが飛び込んできました!!!

Google PixelシリーズはGoogle社が直接設計・販売する正真正銘の純正ブランドで、今回発売が予告されたAndroidスマートフォンはPixelシリーズの新モデルのスマートフォンであるPixel 3である可能性が高いとのこと。

Googleの「Pixel 3」日本発売が濃厚に。ティザーサイト公開 – 価格.com

Pixel 3はAndroid OSの最新バージョン”Android 9 Pie”が搭載される予定となっており、また、Google公式ビルドのAndroid OSがインストールされるため、OSのアップデートも継続的に入手できる可能性が高いと思われます。

さらにPixelではGoogleの最新の成果(“Google Lens”や”Google アシスタント”のような)もいち早く試すことができるのも大きな特徴で、Google・Androidのファンにとってはまさに夢のような端末になっています。

Pixelシリーズのスマートフォンは、今まで第二世代まで出ていましたが、いずれも日本国内での販売はありませんでした。
そればかりか、発展途上国向けとされる(Wikipedia)純正Android OSを搭載したブランド、”Android One“が日本国内で発売されており、一部では、現状iPhone一強となっている日本国内向けにGoogleがPixelシリーズの端末を発売すること自体が絶望視されてきました。

Google Pixel 3は日本発売されないだろう……と考える3つの理由 – naenote.net

そういった経緯もあり、今回の発表にはガジェット界隈全体で大きな話題となっています。

現状日本で発売されているAndroid端末はAndroid Oneを除き、新発売の機種に最新のAndroid OSが搭載されなかったり、発売から1、2年ほどでメーカーやキャリアがアップデートを打ち切ってしまったりする問題があり、Androidへの待遇はあまりいいものではありませんでした。
スマートフォンのスペックも一定のラインまで達してしまった現在、Androidを搭載する端末もどこか陳腐化してしまっているような印象だったので、今回のGoogle Pixelの発売がそういったAndroidスマートフォンの現状に風穴を開けてくれるのではないかと密かに期待をしています。

ただ、以前から指摘されていたように、端末を”買わせる”ことで収益を上げようとしてきた国内の大手キャリアが、Pixelのように比較的”長く使える”端末をどのように受け入れていくのかはとても気になるところです。

なお、今回発表された”日本版 Pixel”に、おサイフケータイの搭載があるのではないか、と予測する記事もあり、Pixelの”日本仕様”への対応の可否も気になる点となっています。

グーグルスマホ「Pixel」日本上陸が確定 ── iPhone対抗の肝は「おサイフ」対応である理由 – Business Insider Japan

Googleは米国時間の10月9日に、Made by Googleというイベントを計画しているとのこと。
Pixelの日本発売が予告されて初のイベントとなるので、どんな発表がされるのか是非チェックしたいですね。

また、Google公式のティザーサイトでは、最新情報のメールマガジンの登録ができるようになっているので、Pixelの情報が気になる方は是非登録してみてはいかがでしょうか。

Google Pixel

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

【Android】Intentを使ってカメラを起動する方法

今回は、タイトルにもある通り、Androidアプリでカメラを起動する方法についてです。
なお、カメラの起動には、画面遷移の際に用いられる、Intent を利用します。

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

Take photos|Android Developers
https://developer.android.com/training/camera/photobasics

 

さて、カメラを起動する機能の実装方法ですが、必要なコードは実は下記の2行くらいで済みます。

static final int REQUEST_IMAGE_CAPTURE = 1;

// カメラを起動
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQUEST_IMAGE_CAPTURE);

あとは、AndroidManifest.xmlタグ内に、下記を指定します。

<uses-feature android:name="android.hardware.camera" android:required="true" />

こちらはカメラを起動する際に必要なので、お忘れなく。

で、写真が無事に撮影できると、onActivityResult() が呼び出されるので、そこで行わせたい処理を記述します。
今回は、ImageView に撮影した写真を表示するように指定しています。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        Bitmap bitmap;
        ImageView imageView = findViewById([ImageViewのID]);

        if( data.getExtras() != null){
            bitmap = (Bitmap) data.getExtras().get("data");
            if(bitmap != null){
               imageView.setImageBitmap(bitmap);
            }
        }
    }
}

ここまでを実行すれば、カメラの起動から、撮影した画像の表示までは問題なく動作します。

 

以上、Androidアプリで Intent を使ってカメラを起動する方法でした。
あとは、画像の保存機能の実装ですが、そこまではまだできていません。
原因としては、ストレージの権限あたりかと。
実装出来たら、その方法についても改めてまとめたいと思います。

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

【Android】ImageViewの画像を180度回転させる方法

久しぶりにネイティブアプリを開発しておりますが、その中で、ImageViewの回転が意外と面倒だったので、備忘録としてまとめ。

経緯としては、下の画面のようなじゃんけんアプリを作っている際、相手の手を回転させたくて方法を調べました。

些細なことなんですけど、じゃんけんは相手の手が自分の手とは逆なのが普通なので、こうしたほうがよりそれらしくなるんですよね。

 

画像の回転や縮小・拡大には Matrix を利用します。
が、基本的に画像処理は重い処理なので、あまり多用しないように気を付けてください。

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

[Android] Matrixで画像を回転、フリップ、縮小させる
https://akira-watson.com/android/matrix.html

コードは下記のとおりです。
onCreate() 内に記述してください。

Image View imageView = findViewById(R.id.[ImageViewのID]);
Bitmap bitmap_origin = BitmapFactory.decodeResource(getResources(), [画像パス]);

// 画像の横、縦サイズを取得
int imageWidth = bitmap_origin.getWidth();
int imageHeight = bitmap_origin.getHeight();

// Matrix インスタンス生成
Matrix matrix = new Matrix();
 
// 画像を中心に180度回転
matrix.setRotate(180, imageWidth/2, imageHeight/2);
 
// 180度回転したBitmap画像を生成
Bitmap bitmap_rotate = Bitmap.createBitmap(bitmap_origin, 0, 0, imageWidth, imageHeight, matrix, true);
 
imageView.setImageBitmap(bitmap_rotate);

コードを見てもらえれば分かりますが、CSS のように単純に回転はできず、画像そのものをビットマップに変換してから、回転させて表示するという処理が必要になります。
少々面倒ですが…こうしてコードをまとめておけば、以降はこれをコピー&ペーストするだけで済みますね。

 

以上、ImageViewの画像を回転する方法でした。

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

【アプリ】AndroidでキャッチしたBeaconの情報を確認できるアプリ「Beacon Scanner」

少し前に、CordovaでiBeaconを取り扱う記事を投稿しましたが、そもそもBeaconのUUIDなどがわからなかったので、それを別のアプリで取得しました。
使用したアプリは、「Beacon Scanner」というAndroidアプリです。

Google Playのページはこちらから。

Beacon Scanner – Google Play のアプリ
https://play.google.com/store/apps/details?id=com.bridou_n.beaconscanner

画面のスクリーンショットはこんな感じ。

使い方は、アプリを起動して右下の再生ボタンをタップするだけ。
Beaconの信号をキャッチすると、認識に必要なUUIDやMajor、Minor の情報が表示されます。
なお、Beaconの信号取得には BluetoothON にする必要があるので、そこはお忘れなく。

 

以上、Beaconの信号取得ができるAndroidアプリのご紹介でした。
操作方法も画面もシンプルで使いやすいので、おすすめです!

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

【Cordova】FCMによるプッシュ通知のアイコンが白い四角になるときの対処法

調べていたのは別の症状についてだったのですが、これも有益そうだったので、備忘録としてまとめ。
Cordovaで開発中のアプリに、FCM(Firebase Cloud Messaging)を利用したプッシュ通知機能を追加したのですが、Android端末に送られてきた通知のアイコンに指定した画像が反映されず、単なる四角形になってしまったときの対処法について。

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

IonicでFCMによるpush通知を行う – Qiita
https://qiita.com/saihoooooooo/items/34712738d5cc6f03cdf4

また、使用しているプラグインはこちらです。

GitHub – fechanique/cordova-plugin-fcm: Google FCM Push Notifications Cordova Plugin
https://github.com/fechanique/cordova-plugin-fcm

 

で、対処法ですが、そもそも原因はアイコン画像が指定されていないか、指定方法が間違っているのが原因です。
そのため、下記の場所にそれぞれアイコンを保存します。

  • platforms/android/res/mipmap-ldpi
  • platforms/android/res/mipmap-mhdpi
  • platforms/android/res/mipmap-hdpi
  • platforms/android/res/mipmap-xxhdpi
  • platforms/android/res/mipmap-xxhdpi
  • platforms/android/res/mipmap-xxxhdpi

そして、config.xml で、下記のようにアイコンの指定を行います。

<platform name="android">
    <resource-file src="resources/android/fcm_push_icon/drawable-ldpi-icon.png" target="res/mipmap-ldpi/fcm_push_icon.png" />
    <resource-file src="resources/android/fcm_push_icon/drawable-mdpi-icon.png" target="res/mipmap-mdpi/fcm_push_icon.png" />
    <resource-file src="resources/android/fcm_push_icon/drawable-hdpi-icon.png" target="res/mipmap-hdpi/fcm_push_icon.png" />
    <resource-file src="resources/android/fcm_push_icon/drawable-xhdpi-icon.png" target="res/mipmap-xhdpi/fcm_push_icon.png" />
    <resource-file src="resources/android/fcm_push_icon/drawable-xxhdpi-icon.png" target="res/mipmap-xxhdpi/fcm_push_icon.png" />
    <resource-file src="resources/android/fcm_push_icon/drawable-xxxhdpi-icon.png" target="res/mipmap-xxxhdpi/fcm_push_icon.png" />
</platform>

なお、厳密にこのとおりでなくても良いようなので、ファイル名などは適宜変更してください。

あとは、送信時のJSONデータに、アイコンと色を指定すればOKです。

{
  "to": [デバイストークン],
  "priority": "high",
  "notification": {
    "icon"  : [アイコン画像],
    "color" : [色コード],
    "title" : [アプリ名],
    "body"  : [メッセージ],
    "sound" : "default",
  }
}

…が、私の環境ではまだ直っていないので、きっとどこかにミスがあります…。
恐らくですが、アイコン画像の場所とかが怪しいかな。

 

以上、Androidでプッシュ通知にアイコン画像が反映されていない時の対処法でした。
意外とこういう小さな箇所って、だからこそ目についたりするので、気を付けたいですね。

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

【android Java】初心者向け・Linearlayoutの使い方

今日は、androidstudioのレイアウトについて気づいたことを備忘録に残したいと思います。

今回はLinearlayoutの使い方をメインに綴ります。

お題の主役であるLinearLayoutは、ある部品を等しく一直線に並べたいと思ったときによく用いられます。Layoutの中でも最も使用頻度が高く汎用性のあるレイアウトといっていいでしょう。htmlでいうdivの役割と似ていますね。

使い方は、シンプルで一直線に並べたい部品を中に囲むだけ。下記のように書くだけです。

例えば、ボタン三つを横一列で中心に表示したい時は
android:orientation="horizontal"
android:layout_gravity="center"

と<Linearlayout内でプロパティを決めます。
Designタグを見て下記のようになっていれば成功です。

これだけならすごく簡単ですね。

複数の部品を決まった場所にそれぞれ配置したいとなってくるとRalativelayoutを使う必要がありますが、簡単なアプリを作ってみたいというかたはまずはLinearlayoutから触ってみてください。他にもTablelayoutやGridlayoutなど様々な特徴を持ったレイアウトがありますが、使う機会があったらまたやんわりと紹介していきたいと思います。

 

 

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