mirror of
https://github.com/commons-app/apps-android-commons.git
synced 2025-10-26 20:33:53 +01:00
Merge pull request #915 from Bluesir9/fix_896_gps_info_multiple_images
Fixed issue where GPS data was not getting sent when uploading multiple images
This commit is contained in:
commit
62aee8c34d
3 changed files with 105 additions and 1 deletions
|
|
@ -197,6 +197,10 @@ public class Contribution extends Media {
|
||||||
this.localUri = localUri;
|
this.localUri = localUri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setDecimalCoords(String decimalCoords) {
|
||||||
|
this.decimalCoords = decimalCoords;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private String licenseTemplateFor(String license) {
|
private String licenseTemplateFor(String license) {
|
||||||
switch (license) {
|
switch (license) {
|
||||||
|
|
@ -215,6 +219,7 @@ public class Contribution extends Media {
|
||||||
case Prefs.Licenses.CC_BY_SA:
|
case Prefs.Licenses.CC_BY_SA:
|
||||||
return "{{self|cc-by-sa-3.0}}";
|
return "{{self|cc-by-sa-3.0}}";
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new RuntimeException("Unrecognized license value: " + license);
|
throw new RuntimeException("Unrecognized license value: " + license);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,21 +3,27 @@ package fr.free.nrw.commons.upload;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.ContentUris;
|
import android.content.ContentUris;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
import android.content.SharedPreferences;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
|
import android.preference.PreferenceManager;
|
||||||
import android.provider.DocumentsContract;
|
import android.provider.DocumentsContract;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileDescriptor;
|
import java.io.FileDescriptor;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.channels.FileChannel;
|
import java.nio.channels.FileChannel;
|
||||||
|
import java.util.Date;
|
||||||
|
|
||||||
|
import fr.free.nrw.commons.CommonsApplication;
|
||||||
import timber.log.Timber;
|
import timber.log.Timber;
|
||||||
|
|
||||||
public class FileUtils {
|
public class FileUtils {
|
||||||
|
|
@ -91,8 +97,41 @@ public class FileUtils {
|
||||||
// File
|
// File
|
||||||
else if ("file".equalsIgnoreCase(uri.getScheme())) {
|
else if ("file".equalsIgnoreCase(uri.getScheme())) {
|
||||||
return uri.getPath();
|
return uri.getPath();
|
||||||
|
} else {
|
||||||
|
//fetching path may fail depending on the source URI and all hope is lost
|
||||||
|
//so we will create and use a copy of the file, which seems to work
|
||||||
|
String copyPath = null;
|
||||||
|
try {
|
||||||
|
ParcelFileDescriptor descriptor
|
||||||
|
= context.getContentResolver().openFileDescriptor(uri, "r");
|
||||||
|
if (descriptor != null) {
|
||||||
|
SharedPreferences sharedPref = PreferenceManager
|
||||||
|
.getDefaultSharedPreferences(context);
|
||||||
|
boolean useExtStorage = sharedPref.getBoolean("useExternalStorage", true);
|
||||||
|
if (useExtStorage) {
|
||||||
|
copyPath = Environment.getExternalStorageDirectory().toString()
|
||||||
|
+ "/CommonsApp/" + new Date().getTime() + ".jpg";
|
||||||
|
File newFile = new File(Environment.getExternalStorageDirectory().toString() + "/CommonsApp");
|
||||||
|
newFile.mkdir();
|
||||||
|
FileUtils.copy(
|
||||||
|
descriptor.getFileDescriptor(),
|
||||||
|
copyPath);
|
||||||
|
Timber.d("Filepath (copied): %s", copyPath);
|
||||||
|
return copyPath;
|
||||||
|
}
|
||||||
|
copyPath = context.getCacheDir().getAbsolutePath()
|
||||||
|
+ "/" + new Date().getTime() + ".jpg";
|
||||||
|
FileUtils.copy(
|
||||||
|
descriptor.getFileDescriptor(),
|
||||||
|
copyPath);
|
||||||
|
Timber.d("Filepath (copied): %s", copyPath);
|
||||||
|
return copyPath;
|
||||||
|
}
|
||||||
|
} catch (IOException e) {
|
||||||
|
Timber.w(e, "Error in file " + copyPath);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,9 @@ import android.database.DataSetObserver;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.os.ParcelFileDescriptor;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
|
import android.support.annotation.Nullable;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.support.v4.app.FragmentManager;
|
import android.support.v4.app.FragmentManager;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
|
|
@ -21,6 +23,7 @@ import android.view.inputmethod.InputMethodManager;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -69,6 +72,8 @@ public class MultipleShareActivity extends AuthenticatedActivity
|
||||||
private MediaDetailPagerFragment mediaDetails;
|
private MediaDetailPagerFragment mediaDetails;
|
||||||
private CategorizationFragment categorizationFragment;
|
private CategorizationFragment categorizationFragment;
|
||||||
|
|
||||||
|
private boolean locationPermitted = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Media getMediaAtPosition(int i) {
|
public Media getMediaAtPosition(int i) {
|
||||||
return photosList.get(i);
|
return photosList.get(i);
|
||||||
|
|
@ -213,6 +218,14 @@ public class MultipleShareActivity extends AuthenticatedActivity
|
||||||
|
|
||||||
getSupportFragmentManager().addOnBackStackChangedListener(this);
|
getSupportFragmentManager().addOnBackStackChangedListener(this);
|
||||||
requestAuthToken();
|
requestAuthToken();
|
||||||
|
|
||||||
|
//TODO: 15/10/17 should location permission be explicitly requested if not provided?
|
||||||
|
//check if location permission is enabled
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
||||||
|
if (ContextCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
|
||||||
|
locationPermitted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
@ -258,6 +271,11 @@ public class MultipleShareActivity extends AuthenticatedActivity
|
||||||
up.setTag("sequence", i);
|
up.setTag("sequence", i);
|
||||||
up.setSource(Contribution.SOURCE_EXTERNAL);
|
up.setSource(Contribution.SOURCE_EXTERNAL);
|
||||||
up.setMultiple(true);
|
up.setMultiple(true);
|
||||||
|
String imageGpsCoordinates = extractImageGpsData(uri);
|
||||||
|
if (imageGpsCoordinates != null) {
|
||||||
|
Timber.d("GPS data for image found!");
|
||||||
|
up.setDecimalCoords(imageGpsCoordinates);
|
||||||
|
}
|
||||||
photosList.add(up);
|
photosList.add(up);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -287,4 +305,46 @@ public class MultipleShareActivity extends AuthenticatedActivity
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible());
|
getSupportActionBar().setDisplayHomeAsUpEnabled(mediaDetails != null && mediaDetails.isVisible());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Will attempt to extract the gps coordinates using exif data or by using the current
|
||||||
|
* location if available for the image who's imageUri has been provided.
|
||||||
|
* @param imageUri The uri of the image who's GPS coordinates data we wish to extract
|
||||||
|
* @return GPS coordinates as a String as is returned by {@link GPSExtractor}
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
private String extractImageGpsData(Uri imageUri) {
|
||||||
|
Timber.d("Entering extractImagesGpsData");
|
||||||
|
|
||||||
|
if (imageUri == null) {
|
||||||
|
//now why would you do that???
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
GPSExtractor gpsExtractor = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
ParcelFileDescriptor fd = getContentResolver().openFileDescriptor(imageUri,"r");
|
||||||
|
if (fd != null) {
|
||||||
|
gpsExtractor = new GPSExtractor(fd.getFileDescriptor(),this,prefs);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
String filePath = FileUtils.getPath(this,imageUri);
|
||||||
|
if (filePath != null) {
|
||||||
|
gpsExtractor = new GPSExtractor(filePath,this,prefs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpsExtractor != null) {
|
||||||
|
//get image coordinates from exif data or user location
|
||||||
|
return gpsExtractor.getCoords(locationPermitted);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (FileNotFoundException fnfe) {
|
||||||
|
Timber.w(fnfe);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue