Сделайте снимок и сохраните его на внутренней памяти в Android - PullRequest
0 голосов
/ 22 января 2020

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    iv1 = (ImageView)findViewById(R.id.iv);
    b1 = findViewById(R.id.b1);
    b1.setOnClickListener(new View.OnClickListener()
    {
      @Override
      public void onClick(View v) {
         takePicture(v);
      }
    });

// Ниже используется проверка прав доступа

  if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
        {
          ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE }, 0);
        }
    }

// Ниже приведен способ съемки

        private void takePicture(View v)
        {
            Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
             **file** = Uri.fromFile(getOutputMediaFile());

            i.putExtra(MediaStore.EXTRA_OUTPUT, **file**);


            startActivityForResult(i, 100);
        }

//get the picture
        private static File getOutputMediaFile()
        {
            File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES), "FotoAula");

            if (!mediaStorageDir.exists()){
                if (!mediaStorageDir.mkdirs()){
                    return null;
                }
            }

            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            return new File(mediaStorageDir.getPath() + File.separator +
                    "IMG_"+ timeStamp + ".jpg");
        }

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == 100) {
                if (resultCode == RESULT_OK) {

                    iv.setImageURI(**file**);
                }
            }
        }
    }

Ответы [ 4 ]

0 голосов
/ 22 января 2020

Я пытался использовать это, оно работало.

 public void saveImage(View view) throws IOException {
        BitmapDrawable draw = (BitmapDrawable) iv1.getDrawable();
        Bitmap bitmap = draw.getBitmap();

        FileOutputStream outStream = null;
        File sdCard = Environment.getExternalStorageDirectory();
        File dir = new File(sdCard.getAbsolutePath() + "/YourFolderName");
        dir.mkdirs();
        String fileName = String.format("%d.jpg", System.currentTimeMillis());
        File outFile = new File(dir, fileName);
        outStream = new FileOutputStream(outFile);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
        outStream.flush();
        outStream.close();


        Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(outFile));
        sendBroadcast(intent);
    }
0 голосов
/ 22 января 2020

Прежде всего объявите этот блок в файле манифеста для использования камеры.

<uses-feature android:name="android.hardware.camera" android:required="false" /> 

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 

Затем проверьте разрешения для Android 23 SDK и выше.

if(ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
        {
          ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE,  Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
        }
    }

Объявите метод для нового файл изображения.

private File getPictureFile() {
  String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
  String pictureFile = "ZOFTINO_" + timeStamp;
  File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
  File image = File.createTempFile(pictureFile,  ".jpg", storageDir);
  pictureFilePath = image.getAbsolutePath();
  return image; 
}

Затем создайте метод фотосъемки.

private void takePicture() {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(cameraIntent, REQUEST_PICTURE_CAPTURE);

    File pictureFile = null;
    try {
        pictureFile = getPictureFile();
    } catch (IOException ex) {
        Toast.makeText(this,
                "Photo file can't be created, please try again",
                Toast.LENGTH_SHORT).show();
        return;
    }
    if (pictureFile != null) {
        Uri photoURI = FileProvider.getUriForFile(this,
                "com.zoftino.android.fileprovider",
                pictureFile);
        cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
        startActivityForResult(cameraIntent, REQUEST_PICTURE_CAPTURE);
    }
} 
}

Затем определите FileProvider в файле манифеста.

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.zoftino.android.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_list"></meta-data>
</provider> 

Определите список путей к файлам для FileProvider в файле xml и сохраните его в папке res / xml.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="zoftino_pic" 
        path="Android/data/zoftino.com.camera/files/Pictures" />
</paths> 

Наконец вы получаете результат камеры из метода OnActivityResult.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_PICTURE_CAPTURE && resultCode == RESULT_OK) {
        File imgFile = new  File(pictureFilePath);
        if(imgFile.exists())            {
            // You will use imgFile.
        }
    }
} 
0 голосов
/ 22 января 2020

Прежде всего, надеясь, что вы уже определили FileProvider в своем манифесте,

замените вашу строку

**file** = Uri.fromFile(getOutputMediaFile());

на

Uri file = FileProvider.getUriForFile(this,
      "com.example.android.fileprovider",
      getOutputMediaFile());

Примечание: здесь "ком. пример. android .fileprovider "- это android: права доступа, определенные внутри FileProvider в вашем манифесте

0 голосов
/ 22 января 2020

Вы можете попробовать это -

private static final int CAMERA_IMAGE = 1010;
private Uri imageUri;

private void captureImage() {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File f = new File(Environment.getExternalStorageDirectory(), "my_image.jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
        imageUri = Uri.fromFile(f);
        startActivityForResult(intent, CAMERA_IMAGE);
    }

@Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);

            if (requestCode == CAMERA_IMAGE && resultCode == Activity.RESULT_OK) {
                if(imageUri != null){
                    Uri selectedImage = imageUri;
                    getContentResolver().notifyChange(selectedImage, null);
                    Bitmap bitmap = getBitmapFromUri(imageUri.getPath());
                    if(bitmap != null){
                        iv.setImageBitmap(bitmap);                
                    }
                }
            } 
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...