Как отправить метаданные / EXIF ​​с тоста на ярлык с помощью кнопки - PullRequest
0 голосов
/ 23 октября 2019

Я занимаюсь разработкой приложения с метаданными из фотографии. Я хочу загрузить изображение, а затем показать все метаданные его фотографии (я использую ExifInterface). После этого показывалось местоположение, которое похоже на информацию карт, приведенную выше, на информацию метаданных. Итак, после этого информация, такая как метаданные, широта и долгота, сохраняются в базе данных.

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

Вот код для основной активности java

package com.example.cameragallery;

import android.Manifest;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.media.ExifInterface;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.DocumentsContract;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.DexterError;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.PermissionRequestErrorListener;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;


    public class MainActivity extends AppCompatActivity {

    // Defining Permission codes.
    // We can give any value
    // but unique for each permission.
    private static final int CAMERA_PERMISSION_CODE = 100;
    private static final int STORAGE_PERMISSION_CODE = 101;
    private ImageView imageview;
    private static final String IMAGE_DIRECTORY = "/wisata";
    private int GALLERY = 1, CAMERA = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        requestMultiplePermissions();
        Button btn = findViewById(R.id.btn);
        imageview = findViewById(R.id.iv);


        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showPictureDialog();
            }
        });

        Button upload = findViewById(R.id.btn1);

        upload.setOnClickListener(new View.OnClickListener() {
            @RequiresApi(api = Build.VERSION_CODES.N)
            @Override
            public void onClick(View v) {
                        ExifInterface exifInterface;

                        String exif="Exif: ";
                    exif += "\nIMAGE_LENGTH: " +
                            exifInterface.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
                    exif += "\nIMAGE_WIDTH: " +
                            exifInterface.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
                    exif += "\n DATETIME: " +
                            exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
                    exif += "\n TAG_MAKE: " +
                            exifInterface.getAttribute(ExifInterface.TAG_MAKE);
                    exif += "\n TAG_MODEL: " +
                            exifInterface.getAttribute(ExifInterface.TAG_MODEL);
                    exif += "\n TAG_ORIENTATION: " +
                            exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);
                    exif += "\n TAG_WHITE_BALANCE: " +
                            exifInterface.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
                    exif += "\n TAG_FOCAL_LENGTH: " +
                            exifInterface.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);
                    exif += "\n TAG_FLASH: " +
                            exifInterface.getAttribute(ExifInterface.TAG_FLASH);
                    exif += "\nGPS related:";
                    exif += "\n TAG_GPS_DATESTAMP: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_DATESTAMP);
                    exif += "\n TAG_GPS_TIMESTAMP: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_TIMESTAMP);
                    exif += "\n TAG_GPS_LATITUDE: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
                    exif += "\n TAG_GPS_LATITUDE_REF: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
                    exif += "\n TAG_GPS_LONGITUDE: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
                    exif += "\n TAG_GPS_LONGITUDE_REF: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
                    exif += "\n TAG_GPS_PROCESSING_METHOD: " +
                            exifInterface.getAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD);


        }
    });
}

/*binary file gambar */

private String getRealPathFromURI(Uri uri){
    String filePath = "";
    String wholeID = DocumentsContract.getDocumentId(uri);

    // Split at colon, use second item in the array
    String id = wholeID.split(":")[1];

    String[] column = { MediaStore.Images.Media.DATA };

    // where id is equal to
    String sel = MediaStore.Images.Media._ID + "=?";

    Cursor cursor = getApplicationContext().getContentResolver()
            .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    column, sel, new String[]{ id }, null);

    int columnIndex = cursor.getColumnIndex(column[0]);

    if (cursor.moveToFirst()) {
        filePath = cursor.getString(columnIndex);
    }
    cursor.close();
    return filePath;
}

/*kasih pilhan ke usee mau take a picture from camera atau take pict from galeri*/

private void showPictureDialog(){
    AlertDialog.Builder pictureDialog = new AlertDialog.Builder(this);
    pictureDialog.setTitle("Select Action");
    String[] pictureDialogItems = {
            "Select photo from gallery",
            "Capture photo from camera" };
    pictureDialog.setItems(pictureDialogItems,
            new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    switch (which) {
                        case 0:
                            choosePhotoFromGallary();
                            break;
                        case 1:
                            takePhotoFromCamera();
                            break;
                    }
                }
            });
    pictureDialog.show();
}

/*API buat kasih akses ke galeri */

public void choosePhotoFromGallary() {
    Intent galleryIntent = new Intent(Intent.ACTION_PICK,
            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

    startActivityForResult(galleryIntent, GALLERY);
}

/*function intents CAMERA API BUAT AMBIL GAMBAR */

private void takePhotoFromCamera() {
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, CAMERA);
}

/*baca semua permissions camera, direktori n sd card */

private void  requestMultiplePermissions(){
    Dexter.withActivity(this)
            .withPermissions(
                    Manifest.permission.CAMERA,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,
                    Manifest.permission.READ_EXTERNAL_STORAGE)
            .withListener(new MultiplePermissionsListener() {
                @Override
                public void onPermissionsChecked(MultiplePermissionsReport report) {
                    // check if all permissions are granted
                    if (report.areAllPermissionsGranted()) {
                        Toast.makeText(getApplicationContext(), "All permissions are granted by user!", Toast.LENGTH_SHORT).show();
                    }

                    // check for permanent denial of any permission
                    if (report.isAnyPermissionPermanentlyDenied()) {
                        // show alert dialog navigating to Settings
                        //openSettingsDialog();
                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).
            withErrorListener(new PermissionRequestErrorListener() {
                @Override
                public void onError(DexterError error) {
                    Toast.makeText(getApplicationContext(), "Some Error! ", Toast.LENGTH_SHORT).show();
                }
            })
            .onSameThread()
            .check();
}

/*nampilin gambar yg dipilih sama toast metadatanya */

@RequiresApi(api = Build.VERSION_CODES.N)
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == this.RESULT_CANCELED) {
        return;
    }
    if (requestCode == GALLERY) {
        if (data != null) {
            Uri contentURI = data.getData();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentURI);
                String path = saveImage(bitmap);
                Toast.makeText(MainActivity.this, "Image Saved!", Toast.LENGTH_SHORT).show();
                imageview.setImageBitmap(bitmap);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    showExif(contentURI);
                }

            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(MainActivity.this, "Failed!", Toast.LENGTH_SHORT).show();
            }
        }

    } else if (requestCode == CAMERA) {
        Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
        imageview.setImageBitmap(thumbnail);
        saveImage(thumbnail);
        Toast.makeText(MainActivity.this, "Image Saved!", Toast.LENGTH_SHORT).show();
    }
}

/*simpan image dan buat direktori namanya folder wisata*/
public String saveImage(Bitmap myBitmap) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    myBitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
    File wallpaperDirectory = new File(
            Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
    // have the object build the directory structure, if needed.
    if (!wallpaperDirectory.exists()) {
        wallpaperDirectory.mkdirs();
    }

    try {
        File f = new File(wallpaperDirectory, Calendar.getInstance()
                .getTimeInMillis() + ".jpg");
        f.createNewFile();
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());
        MediaScannerConnection.scanFile(this,
                new String[]{f.getPath()},
                new String[]{"wisata/jpeg"}, null);
        fo.close();
        Log.d("TAG", "File Saved::---&gt;" + f.getAbsolutePath());

        return f.getAbsolutePath();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    return "";
}

// This function is called when the user acccepts or decline the permission.
// Request Code is used to check which permission called this function.
// This request code is provided when the user is prompt for permission.

/*permissions*/

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults)
{
    super
            .onRequestPermissionsResult(requestCode,
                    permissions,
                    grantResults);

    if (requestCode == CAMERA_PERMISSION_CODE) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(MainActivity.this,
                    "Camera Permission Granted",
                    Toast.LENGTH_SHORT)
                    .show();
        }
        else {
            Toast.makeText(MainActivity.this,
                    "Camera Permission Denied",
                    Toast.LENGTH_SHORT)
                    .show();
        }
    }
    else if (requestCode == STORAGE_PERMISSION_CODE) {
        if (grantResults.length > 0
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(MainActivity.this,
                    "Storage Permission Granted",
                    Toast.LENGTH_SHORT)
                    .show();
        }
        else {
            Toast.makeText(MainActivity.this,
                    "Storage Permission Denied",
                    Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

/*function untuk exif / baca metadata */

@RequiresApi(api = Build.VERSION_CODES.N)
void showExif(Uri photoUri){
    if(photoUri != null){

        /*
        How to convert the Uri to InputStream, refer to the example in the document:
        https://developer.android.com/guide/topics/providers/document-provider.html
         */

        try {
            InputStream inputStream = getContentResolver().openInputStream(photoUri);

            /*
            ExifInterface (InputStream inputStream) added in API level 24
             */
            ExifInterface exifInterface = new ExifInterface(inputStream);

            String exif="Exif: ";
            exif += "\nIMAGE_LENGTH: " +
                    exifInterface.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
            exif += "\nIMAGE_WIDTH: " +
                    exifInterface.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
            exif += "\n DATETIME: " +
                    exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
            exif += "\n TAG_MAKE: " +
                    exifInterface.getAttribute(ExifInterface.TAG_MAKE);
            exif += "\n TAG_MODEL: " +
                    exifInterface.getAttribute(ExifInterface.TAG_MODEL);
            exif += "\n TAG_ORIENTATION: " +
                    exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION);
            exif += "\n TAG_WHITE_BALANCE: " +
                    exifInterface.getAttribute(ExifInterface.TAG_WHITE_BALANCE);
            exif += "\n TAG_FOCAL_LENGTH: " +
                    exifInterface.getAttribute(ExifInterface.TAG_FOCAL_LENGTH);
            exif += "\n TAG_FLASH: " +
                    exifInterface.getAttribute(ExifInterface.TAG_FLASH);
            exif += "\nGPS related:";
            exif += "\n TAG_GPS_DATESTAMP: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_DATESTAMP);
            exif += "\n TAG_GPS_TIMESTAMP: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_TIMESTAMP);
            exif += "\n TAG_GPS_LATITUDE: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
            exif += "\n TAG_GPS_LATITUDE_REF: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_LATITUDE_REF);
            exif += "\n TAG_GPS_LONGITUDE: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
            exif += "\n TAG_GPS_LONGITUDE_REF: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF);
            exif += "\n TAG_GPS_PROCESSING_METHOD: " +
                    exifInterface.getAttribute(ExifInterface.TAG_GPS_PROCESSING_METHOD);

            inputStream.close();

            Toast.makeText(getApplicationContext(),
                    exif,
                    Toast.LENGTH_LONG).show();


        } catch (FileNotFoundException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),
                    "Something wrong:\n" + e.toString(),
                    Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),
                    "Something wrong:\n" + e.toString(),
                    Toast.LENGTH_LONG).show();
        }

    }else{
        Toast.makeText(getApplicationContext(),
                "photoUri == null",
                Toast.LENGTH_LONG).show();
    }
};

}

Я ожидал, когда я нажму кнопку загрузки, он покажет свои метаданные и карты. Кто-нибудь может помочь? заранее спасибо

...