Мое приложение, которое использует камеру, НЕ записывает широту и долготу (метаданные файла) - PullRequest
0 голосов
/ 29 января 2020

.... но когда это делается со стандартной камерой, она работает отлично.

Я борюсь с кодом, который позволяет мне делать снимок в фрагменте, а также позволяет мне проверить его предварительный просмотр с помощью de LatLng на карте (еще один фрагмент) с двумя метками, показывающими широту и долготу.

Я пришел к выводу, что проблема должна быть при съемке фотографии, потому что я могу видеть широту и долготу при получении фотография стандартной камеры из галереи. Файлы, созданные с моим приложением, вообще не имеют геолокации.

Я пробовал разные разрешения. Я проверяю тип файла JPG Я проверяю android карту Точность I, но есть странная проблема "если я перезагружаю свой эмулятор PHONE и запускаюсь, когда он работает нормально для первого снимка камеры"

The left one represents a Photo made by my app(NO LatLan) the other one with the standard  data is in it.

'' '

publi c Класс HomeFragment расширяет фрагмент {

private final String TAG = "HomeFragment";
//
private Uri uriSavedImage;
private ImageView imageView;
private Button btn_takePhoto;
private static final int CAPTURA_RQC = 1;
private static final int REQUEST_PERMISION_CODE = 2;
private View root;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    root = inflater.inflate(R.layout.fragment_home, container, false);
    imageView = root.findViewById(R.id.imageView2);
    //
    btn_takePhoto = root.findViewById(R.id.button);
    btn_takePhoto.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //checkPermissions
            if (checkPermissions()) {
                takePhoto();
            } else {
                askForPermissions();
            }
        }
    });
    return root;
}

public void takePhoto() {
    //takePhoto
    //Allows access otherwise...
    ///     android.os.FileUriExposedException: file:///sdcard/DCIM/Camera/... .png exposed beyond app through ClipData.Item.getUri()
    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());
    //Crear el intent
    Intent hacerFotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    //Create unique name.
    long timeStamp = System.currentTimeMillis();

    /**
     * I think the problem is around here.
     */
    //Different  path taken form emulator
    String pathname = "/sdcard/DCIM/Camera/image_" + timeStamp + ".JPG";
    // String pathname = "/sdcard/file_example.png";
    // 
    uriSavedImage = Uri.fromFile(new File(pathname));
    // 
     hacerFotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, uriSavedImage);
    startActivityForResult(hacerFotoIntent, CAPTURA_RQC);
}

public void fetchImage( ) {
    File imgFile = new File(uriSavedImage.getPath());
    if (imgFile.exists()) {//
        try {
            Bitmap mBitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), uriSavedImage);
            imageView.setImageBitmap(mBitmap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAPTURA_RQC && resultCode == Activity.RESULT_OK) {
        fetchImage( );
    } else {
        Toast toast = Toast.makeText(getActivity(), "Could not find the image ", Toast.LENGTH_SHORT);
        toast.show();
    }
}

/**
 * @return
 */
public boolean checkPermissions() {
    Log.i(TAG, "checkPermissions");
    int permission_read = ActivityCompat.checkSelfPermission(getActivity().getApplicationContext(),
            READ_EXTERNAL_STORAGE);
    int permission_write_sd = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(),
            WRITE_EXTERNAL_STORAGE);
    int permission_access_camera = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(),
            CAMERA);
    int permission_FINE_LOCATION = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(),
            ACCESS_FINE_LOCATION);
    int permission_COARSE_LOCATION = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(),
            ACCESS_COARSE_LOCATION);
    int permission_INTERNT = ContextCompat.checkSelfPermission(getActivity().getApplicationContext(),
           INTERNET);
    return permission_write_sd == PackageManager.PERMISSION_GRANTED
            &&
            permission_read == PackageManager.PERMISSION_GRANTED
            &&
            permission_access_camera == PackageManager.PERMISSION_GRANTED
            &&
            permission_FINE_LOCATION == PackageManager.PERMISSION_GRANTED
            &&
            permission_COARSE_LOCATION == PackageManager.PERMISSION_GRANTED
            &&
            permission_INTERNT == PackageManager.PERMISSION_GRANTED
            ;
}

private void askForPermissions() {
    ActivityCompat.requestPermissions(getActivity(),
            new String[]{
                    CAMERA,
                    READ_EXTERNAL_STORAGE,
                    WRITE_EXTERNAL_STORAGE,
                    ACCESS_FINE_LOCATION,
                    ACCESS_COARSE_LOCATION,
                    ACCESS_FINE_LOCATION,
                    ACCESS_BACKGROUND_LOCATION
            }
            , REQUEST_PERMISION_CODE);
}

}

' ''

1 Ответ

1 голос
/ 29 января 2020

После захвата изображения с камеры и при сохранении растрового изображения в местоположение файла вы можете получить значения lat и long из LocationServices и записать их в файл в виде мета-значений, например show ниже

     String pathname = "/sdcard/DCIM/Camera/image_" + timeStamp + ".JPG";
    ExifInterface exif = new ExifInterface(pathname);
    // call this next setAttributes a few times to write all the GPS data to it.
    exif.setAttribute(... );
    // don't forget to save
    exif.saveAttributes();

вы можете записать любые метаданные, которые вам нужны, с помощью ExifInterface , которые вы должны увидеть позже при проверке деталей фотографии

...