【问题标题】:My App which uses Camera does NOT record the Latitude and Longitude (file meta data)我使用相机的应用程序不记录纬度和经度(文件元数据)
【发布时间】:2020-05-14 11:34:33
【问题描述】:

....但是当使用标准相机时,它可以完美地工作。

我正在努力解决一个允许我在片段中拍照并允许我检查的代码 它在地图(另一个片段)中使用 de LatLng 进行预览,其中两个标签同时显示纬度和经度。

我得出的结论是,问题一定出在拍照时,因为当我从图库中检索标准相机的照片时,我可以看到经纬度。使用我的应用创建的文件可以根本没有地理定位。

我尝试了不同的权限。 我检查文件类型 JPG 我检查 android 地图的准确性 我但是有一个奇怪的问题“如果我重置我的 Emulator PHONE 并在它对第一个相机拍摄正常工作后启动”

'''

公共类 HomeFragment 扩展 Fragment {

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);
}

}

'''

【问题讨论】:

  • “使用我的应用创建的文件根本没有地理定位”——您的应用没有创建任何文件。相机应用程序是。该相机应用程序是用户使用的数百个(如果不是数千个)相机应用程序之一,包括预安装和用户安装的。无论出于何种原因,您碰巧使用的相机应用程序都不会对通过ACTION_IMAGE_CAPTURE 拍摄的照片进行地理标记。可以说,这是一件好事,特别是如果用户无法在相机 UI 的特定部分选择退出它。无论如何,这是相机应用开发者的决定。

标签: java android camera latitude-longitude exif


【解决方案1】:

从相机捕获图像并将位图保存到文件位置后,您可以做的是从 LocationServices 获取 lat 和 long 值并将其作为元值写入文件,例如 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 写入您需要的任何元数据,以便稍后在查看照片的详细信息时看到

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    相关资源
    最近更新 更多