Итак, мы создаем приложение для Android (Android 10+) для веб-сайта. И у нас есть функция для создания профиля элемента на основе GPS-данных EXIF-изображения во время загрузки изображения. В нашем приложении мы используем класс WebChromeClient, который обеспечивает взаимодействие между WebView и приложением Android. Итак, у нас возникла проблема при загрузке изображения: потеря GPS-данных изображения EXIF. Пожалуйста, помогите мне с этим.
P.S.: Чтение данных GPS Exif работает, если веб-сайт открыт в браузере, а не в приложении для Android.
//HTML: field for selecting files on website
//Code From MainActivity.java
private void setupWebView() {
myWeb = findViewById(R.id.myWeb);
WebSettings webSettings = myWeb.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setGeolocationEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setAllowContentAccess(true);
webSettings.setAllowFileAccess(true);
webSettings.setBuiltInZoomControls(true);
webSettings.setDisplayZoomControls(false); // To disable the zoom control buttons
webSettings.setUseWideViewPort(true); // Enable viewport support
webSettings.setLoadWithOverviewMode(true); // Fit content to WebView
myWeb.setWebViewClient(new CustomWebViewClient());
myWeb.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback filePathCallback, FileChooserParams fileChooserParams) {
// Save the callback for later use
if (mFilePathCallback != null) {
mFilePathCallback.onReceiveValue(null); // Cancel the previous callback
}
mFilePathCallback = filePathCallback;
// Create an Intent to pick files
Intent intent = fileChooserParams.createIntent();
// Optionally, restrict the file type here if you want to limit to images:
// intent.setType("image/*");
try {
startActivityForResult(intent, FILECHOOSER_RESULTCODE);
} catch (ActivityNotFoundException e) {
mFilePathCallback = null;
return false;
}
return true;
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); // Call super at the start
if (requestCode == FILECHOOSER_RESULTCODE) {
if (mFilePathCallback != null) {
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
String dataString = data.getDataString();
ClipData clipData = data.getClipData();
// Handle multiple file selection
if (clipData != null) {
results = new Uri[clipData.getItemCount()];
for (int i = 0; i < clipData.getItemCount(); i++) {
results = clipData.getItemAt(i).getUri();
// Optionally read EXIF data here for each Uri if needed
readExifData(results);
}
} else if (dataString != null) {
results = new Uri[]{Uri.parse(dataString)};
// Read EXIF data for single selection
readExifData(results[0]);
}
}
}
mFilePathCallback.onReceiveValue(results);
mFilePathCallback = null;
}
}
}
private void readExifData(Uri imageUri) {
InputStream inputStream = null;
try {
inputStream = getContentResolver().openInputStream(imageUri);
if (inputStream != null) {
ExifInterface exif = new ExifInterface(inputStream);
String latitude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
String latitudeRef = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
String longitudeRef = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
if (latitude != null && longitude != null) {
double lat = convertToDegree(latitude);
if ("S".equals(latitudeRef)) {
lat = -lat; // Convert to negative for Southern Hemisphere
}
double lon = convertToDegree(longitude);
if ("W".equals(longitudeRef)) {
lon = -lon; // Convert to negative for Western Hemisphere
}
// Use the latitude and longitude values
Log.d("EXIF Data", "Latitude: " + lat + ", Longitude: " + lon);
} else {
Log.d("EXIF Data", "No GPS data available.");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
// Helper method to convert EXIF GPS coordinates to degrees
private double convertToDegree(String stringDMS) {
String[] DMS = stringDMS.split(",", -1);
String[] dms = DMS[0].split("/", -1);
double d = Double.parseDouble(dms[0]) / Double.parseDouble(dms[1]);
String[] minutes = DMS[1].split("/", -1);
double m = Double.parseDouble(minutes[0]) / Double.parseDouble(minutes[1]);
String[] seconds = DMS[2].split("/", -1);
double s = Double.parseDouble(seconds[0]) / Double.parseDouble(seconds[1]);
return d + (m / 60.0) + (s / 3600.0); // Degrees
}
//code from AndroidManifest.xml
Подробнее здесь: https://stackoverflow.com/questions/790 ... romeclient
Потеря данных EXIF GPS для загрузки изображения через приложение для Android (WebChromeClient) ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Выбор фотографии из Интернета в Android больше не включает местоположение Exif GPS.
Anonymous » » в форуме Android - 0 Ответы
- 16 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Выбор фотографии из Интернета в Android больше не включает местоположение Exif GPS.
Anonymous » » в форуме Android - 0 Ответы
- 6 Просмотры
-
Последнее сообщение Anonymous
-