Потеря данных EXIF ​​GPS для загрузки изображения через приложение для Android (WebChromeClient)JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Потеря данных EXIF ​​GPS для загрузки изображения через приложение для Android (WebChromeClient)

Сообщение Anonymous »

Итак, мы создаем приложение для 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»