Rabu, 25 November 2015

Membuat Aplikasi Android untuk Membaca Koordinat Latitude Longitude Geotagging dari Foto dan Mengedit Geolocation GPS dari File Image

Membuat Aplikasi Android untuk Membaca Koordinat Latitude Longitude Geotagging dari Foto, Membaca Geolocation GPS dari File Image bisa digunakan untuk memperoleh Posisi GPS Lat Long dari sebuah photo yang diambil menggunakan kamera hp/tablet yang sudah diaktifkan fitur geotagging-nya.

Sebenarnya tidak hanya informasi Geolocation Latitude Longitude yang bisa dibaca dari sebuah file Image, tetapi juga tanggal pembuatan, dan sebagainya. Bahkan android sebenarnya juga mampu mengubah atau mengedit informasi dalam sebuah foto Geotagging untuk mengganti data GPS, tanggal pembuatan, dan sebagainya.

Tetapi dalam tutorial kali ini yang akan dibahas hanya pembacaan Koordinat Lintang Bujur GPS dari Foto Geotagging saja.

Pertama silakan membuat Project Android baru di Eclipse atau Android Studio, tambahkan dua buah Button.


Jangan lupa menambahkan permission untuk membaca dan menulis file di eksternal storage SDCard.

Selanjutnya buka MainActivity.java, tambahkan kode program berikut ini :

package com.example.image_geotagging_get_latitude_longitude_gps; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.location.Location; import android.media.ExifInterface; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { Button button1; Button button2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Location loc = readGeoTagImage("//sdcard/test-geotagging.jpg"); Toast.makeText(getApplicationContext(), "OK " + String.valueOf(loc.getLatitude()) + " " + String.valueOf(loc.getLongitude()), Toast.LENGTH_LONG).show(); } }); button2 = (Button)findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub Location loc = new Location(""); loc.setLatitude(-7); loc.setLongitude(110); MarkGeoTagImage("//sdcard/test-geotagging.jpg", loc); Toast.makeText(getApplicationContext(), "OK ", Toast.LENGTH_LONG).show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public Location readGeoTagImage(String imagePath) { Location loc = new Location(""); try { ExifInterface exif = new ExifInterface(imagePath); float [] latlong = new float[2] ; if(exif.getLatLong(latlong)){ loc.setLatitude(latlong[0]); loc.setLongitude(latlong[1]); } String date = exif.getAttribute(ExifInterface.TAG_DATETIME); SimpleDateFormat fmt_Exif = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); loc.setTime(fmt_Exif.parse(date).getTime()); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } return loc; } public void MarkGeoTagImage(String imagePath,Location location) { try { ExifInterface exif = new ExifInterface(imagePath); exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE, GPS.convert(location.getLatitude())); exif.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, GPS.latitudeRef(location.getLatitude())); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE, GPS.convert(location.getLongitude())); exif.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, GPS.longitudeRef(location.getLongitude())); SimpleDateFormat fmt_Exif = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss"); exif.setAttribute(ExifInterface.TAG_DATETIME,fmt_Exif.format(new Date(location.getTime()))); exif.saveAttributes(); } catch (IOException e) { e.printStackTrace(); } } }

Kemudian buat class baru dengan nama GPS.java, masukkan kode program seperti ini :

package com.example.image_geotagging_get_latitude_longitude_gps; class GPS { private static StringBuilder sb = new StringBuilder(20); /** * returns ref for latitude which is S or N. * * @param latitude * @return S or N */ public static String latitudeRef(final double latitude) { return latitude < 0.0d ? "S" : "N"; } /** * returns ref for latitude which is S or N. * * @param latitude * @return S or N */ public static String longitudeRef(final double longitude) { return longitude < 0.0d ? "W" : "E"; } /** * convert latitude into DMS (degree minute second) format. For instance<br/> * -79.948862 becomes<br/> * 79/1,56/1,55903/1000<br/> * It works for latitude and longitude<br/> * * @param latitude could be longitude. * @return */ public static final String convert(double latitude) { latitude = Math.abs(latitude); final int degree = (int)latitude; latitude *= 60; latitude -= degree * 60.0d; final int minute = (int)latitude; latitude *= 60; latitude -= minute * 60.0d; final int second = (int)(latitude * 1000.0d); sb.setLength(0); sb.append(degree); sb.append("/1,"); sb.append(minute); sb.append("/1,"); sb.append(second); sb.append("/1000,"); return sb.toString(); } } 

Untuk tampilan, buat desain tampilan berikut ini pada activity_main.xml, tambahkan dua button, kemudian buat tampilannya menjadi seperti di berikut ini :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get Geotagging Latitude Longitude" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Set Geotagging Latitude Longitude" />
    
</LinearLayout>

Konfigurasi AndroidManifest.xml perlu ditambahkan permission READ_EXTERNAL_STORAGE dan WRITE_EXTERNAL_STORAGE. :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.image_geotagging_get_latitude_longitude_gps"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.image_geotagging_get_latitude_longitude_gps.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Hasilnya setelah dijalankan maka akan tampil seperti ini :


Jika diklik tombol "Get Geotagging Latitude Longitude" maka akan ditampilkan informasi Geotagging dari file Foto, dalam hal ini berada di SDCard paling luar dengan nama "//sdcard/test-geotagging.jpg". Sedangkan jika diklik tombol ""Set Geotagging Latitude Longitude" maka dapat mengeset informasi Latitude Longitude yang ada di sebuah file Image Foto.

Project selengkapnya dapat anda download disini.

Semoga bermanfaat ^_^

1 komentar: