取得した緯度経度をWordPressのデータベースに保存する(途中)

Kotlin

functions.php

事前にWordPressでテーブルを作成しておくこと

// rest apiのエンドポイント(/wp-json/custom/v1/location)をつくる
add_action('rest_api_init', function(){
    register_rest_route('custom/v1', '/location', array(
        'methos' => 'POST',
        'callback' => 'save_location',
        'permission_callback' => '__return_true',
    ));
});

// wp_locationテーブルに位置情報を保存する
function save_location($data) {
    global $wpdb;
    $latitude = $data['latitude'];
    $longitude = $data['longitude'];
    if (!$latitude || !$longitude) {
        return new WP_ERROR('missing_data', '緯度か経度が取得されていません', array('status' => 400));
    }
    $table_name = $wpdb->prefix . 'location';
    $result = $wpdb->insert(
        $table_name,
        array(
            'latitude' => $latitude,
            'longitude' => $longitude,
            'created_at' => current_time('mysql'),
        ),
        array('%f', '%f', '%s')
    );
    if ($result === false) {
        return new WP_ERROR('db_error', '位置情報の保存に失敗しました', array('status' => 500));
    }
    return array('success' => true, 'message' => 'Location saved successfully');
}

AndroidManifest.xml

インターネットアクセス権限を許可します

<uses-permission android:name="android.permission.INTERNET" />

build.gradle.kts

HTTPリクエストを送るために必要なライブラリを追加します

dependencies {
    implementation("com.squareup.retrofit2:retrofit:2.9.0")
    implementation("com.squareup.retrofit2:converter-gson:2.9.0")
}

MainActivity.kt

Retrofitを使ってWP REST APIにデータを送信します

import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.Body
import retrofit2.http.POST
import android.util.Log
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch


data class LocationData(
    val latitude: Double,
    val longitude: Double
)

interface ApiService {
    @POST("custom/v1/location")
    suspend fun saveLocation(@Body locationData: LocationData)
}

// Retrofitクライアント作成
object RetrofitClient {
    private const val BASE_URL = "https://your-wordpress-site.com/wp-json/"

    val apiService: ApiService = Retrofit.Builder()
        .baseUrl(BASE_URL)
        .addConverterFactory(GsonConverterFactory.create())
        .build()
        .create(ApiService::class.java)
}


////////////  
class MainActivity : AppCompatActivity(){

}
////////////


private fun saveLocationToServer(latitude: Double, longitude: Double) {
    val apiService = RetrofitClient.apiService
    val locationData = LocationData(latitude, longitude)

    // 非同期でAPI呼び出し
    CoroutineScope(Dispatchers.IO).launch {
        try {
            apiService.saveLocation(locationData)
            Log.d("MainActivity", "Location saved successfully.")
        } catch (e: Exception) {
            Log.e("MainActivity", "Error saving location: ${e.message}")
        }
    }
}

// getLastLocationの中でサーバーに送信
private fun getLastLocation() {
    if (ActivityCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_FINE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
            this,
            Manifest.permission.ACCESS_COARSE_LOCATION
        ) != PackageManager.PERMISSION_GRANTED
    ) {
        ActivityCompat.requestPermissions(
            this,
            arrayOf(Manifest.permission.ACCESS_FINE_LOCATION),
            LOCATION_PERMISSION_REQUEST_CODE
        )
        return
    }

    fusedLocationClient.lastLocation.addOnSuccessListener { location ->
        if (location != null) {
            val latitude = location.latitude
            val longitude = location.longitude
            Toast.makeText(this, "緯度: $latitude, 経度: $longitude", Toast.LENGTH_LONG).show()

            // サーバーに送信
            saveLocationToServer(latitude, longitude)
        } else {
            Toast.makeText(this, "位置情報が取得できませんでした", Toast.LENGTH_LONG).show()
        }
    }.addOnFailureListener {
        Toast.makeText(this, "位置情報の取得に失敗しました: ${it.message}", Toast.LENGTH_LONG).show()
    }
}
BACK