Android.Как захватить изображение с камеры и сохранить его на сервере? - PullRequest
0 голосов
/ 06 декабря 2018

Я новичок в Android.Я хочу захватить изображение с помощью камеры и сохранить его на сервере.Ниже приведен код для открытия камеры и захвата изображения.

 private void openCamera() {
    requestPermissions(TYPE_IMAGE);
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    intent.putExtra(MediaStore.EXTRA_OUTPUT,contentURI);
    startActivityForResult(intent, CAMERA);
}

После захвата изображения я хочу, чтобы это изображение сохранялось непосредственно на сервере.Заранее спасибо.Нужна помощь. Файл манифеста находится ниже: enter image description here

1 Ответ

0 голосов
/ 06 декабря 2018

Чтобы сохранить изображение, снятое с камеры, переопределите обратный вызов activityResult следующим образом:

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

        if(resultCode==RESULT_OK && requestCode==CAMERA_CODE)
        {
                try {

                    Bundle extras = data.getExtras();
                    Bitmap imageBitmap = (Bitmap) extras.get("data");

                    //if you want to encode the image into base64
                    if (imageBitmap!=null) {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
           String encodeImage = Base64.encodeToString(byteArrayOutputStream.toByteArray(), Base64.DEFAULT);

            //You can send your image to server
                } catch (Exception e) {
                    e.printStackTrace();
                }

           }
       }

РЕДАКТИРОВАТЬ : если вы хотите, чтобы изображение было сохранено как файл в хранилищезатем манипулируйте им оттуда, вам придется действовать по-другому.

  • Сначала вам нужно будет создать путь к файлу внутри подпапки xml папки res и путь к файлу здесь, называемый file_paths.xml, может быть таким:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images"
        path="Android/data/YOUR_PACKAGE/files/Pictures" />
</paths>
  • Затем вам нужно будет создать провайдера внутри Manifest и добавить ресурс file_path в качестве FILE_PROVIDER_PATH:
<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/file_paths" />
        </provider>
  • Затем внутри вашего кода (java) вам нужно будет сгенерировать уникальный путь / имя для изображения (вы можете просто использовать следующий метод для этого):
  private File createImageFile() throws IOException {
        String timeStamp =
                new SimpleDateFormat("yyyyMMdd_HHmmss",
                        Locale.getDefault()).format(new Date());
        String imageFileName = "IMG_" + timeStamp + "_";
        File storageDir =
                getExternalFilesDir(Environment.DIRECTORY_PICTURES);
        File image = File.createTempFile(
                imageFileName,  /* prefix */
                ".jpg",         /* suffix */
                storageDir      /* directory */
        );

        imageFilePath = image.getAbsolutePath();
        return image;
    }

Переменная imageFilePath здесь является членом текущего класса, потому что нам нужно, чтобы он был доступен в любом месте этого класса.

Затем можно запустить камеру, но на этот развы предоставите вывод (где данные будут сtored):

Intent picture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (picture.resolveActivity(getPackageManager()) != null) {

            File photo = null;
                      try {


                          photo = createImageFile();

                     } catch (IOException ex) {

                  }

                 if (photo != null) {
                    Uri photoURI = FileProvider.getUriForFile(this,
                           "YOUR_PACKAGE_NAME.provider",
                        photo);

              picture.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
                startActivityForResult(picture, CAMERA_CODE);

            }
  • И последнее, что нужно сделать, это прослушать результат действия и действовать соответственно:
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode==RESULT_OK)
        {

                try {
                    Bundle extras = data.getExtras();
                    //our imageFilePath that contains the absolute path to the created file 
                    File file = new File(imageFilePath);
                    Bitmap imageBitmap = MediaStore.Images.Media
                            .getBitmap(getContentResolver(), Uri.fromFile(file));
                  //do whatever else after
                } catch (Exception e) {
                    e.printStackTrace();
                }
           }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...