取得した緯度経度をWordPressのデータベースに保存する(途中)
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()
}
}