Как сделать снимок и сохранить его в пользовательской папке для моего приложения, отображаемого в галерее

Я боролся с этим уже несколько дней, и другие ответы, опубликованные в аналогичных вопросах здесь, в stackoverflow, мне не помогли.

Что я хочу сделать, так это установить собственный ArrayAdapter для моего ListView, и внутри этого адаптера я хочу установить onClickListener для кнопки, которая появляется в каждом элементе. Затем я хочу, чтобы пользователь мог выбрать, хочет ли он сделать снимок с помощью камеры или выбрать изображение из галереи. Затем я хочу, чтобы изображение сохранялось в собственной папке приложения внутри галереи. Однако, хотя пользовательская папка создается и отображается в галерее, само изображение хранится в папке «Камера», и я вижу поврежденный файл в пользовательской папке.

Я читал фотоосновы на сайте разработчиков http://developer.android.com/training/camera/photobasics.html, но это мало помогло. Я реализовал onActivityResult внутри своего фрагмента, но путь Uri отличается от пути, созданного в адаптере.

Вот код:

  • В адаптере массива:

    photoPicker.setOnClickListener(new View.OnClickListener()
    {
        @Override public void onClick(View v)
        {
    
            // Camera.
            final List<Intent> cameraIntents = new ArrayList<Intent>();
            final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            final PackageManager packageManager = mContext.getPackageManager();
            final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
            for (ResolveInfo res : listCam)
            {
                final String packageName = res.activityInfo.packageName;
                final Intent intent = new Intent(captureIntent);
                intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                intent.setPackage(packageName);
                cameraIntents.add(intent);
            }
    
            // Filesystem.
            final Intent galleryIntent = new Intent();
            galleryIntent.setType("image/*");
            galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
    
            // Chooser of filesystem options.
            final Intent chooserIntent = Intent.createChooser(galleryIntent, "Vyber zdroj");
    
            // Add the camera options.
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[]{}));
    
            if (chooserIntent.resolveActivity(mContext.getPackageManager()) != null)
            {
                // Create the File where the photo should go
                File photoFile = null;
                try
                {
                    photoFile = createImageFile();
                }
                catch (IOException ex)
                {
                    // Error occurred while creating the File
    
                }
                // Continue only if the File was successfully created
                if (photoFile != null)
                {
                    chooserIntent.putExtra(MediaStore.EXTRA_OUTPUT,
                                           Uri.fromFile(photoFile));
                    Log.i(TAG,"uri from file:"+Uri.fromFile(photoFile).toString());
                    chooserIntent.putExtra("path",mCurrentPhotoPath);
                    fragment.startActivityForResult(chooserIntent, FlowListUtils.getIdFromDate(experience.getDate()));
                }
            }
        }
    });
    
    
     private File createImageFile() throws IOException
    {
    
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    String storagePath = Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_PICTURES).getPath()+"/MyApp";
    
    File storageDir = new File(storagePath);
    storageDir.mkdirs();
    
    File image = File.createTempFile(
            imageFileName,  /* prefix */
            ".jpg",         /* suffix */
            storageDir      /* directory */
    );
    
    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = "file:" + image.getAbsolutePath();
    Log.i(TAG,"mCurrent Photo Path in adapter:"+mCurrentPhotoPath);
    return image;
    }
    
  • Этот код находится в моем фрагменте

     @Override public void onActivityResult(int requestCode, int resultCode, Intent data)
     {
    super.onActivityResult(requestCode, resultCode, data);
    
    ExperienceAdapter.dateForPicture = requestCode;
    ExperienceAdapter.uriForPicture = data.getData();
    
    
    galleryAddPic(path);
    }
    
    
    private void galleryAddPic(String path)
    {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File f = new File(ExperienceAdapter.mCurrentPhotoPath);
    
    Uri contentUri = Uri.fromFile(f);
    mediaScanIntent.setData(contentUri);
    getActivity().sendBroadcast(mediaScanIntent);
    }
    

Путь, который я добавляю к намерению: file:/storage/emulated/0/Pictures/MyApp/JPEG_20140626_133228_1332202116.jpg, но внезапно меняется на content://media/external/images/media/6273 в намерении, возвращаемом onActivityResult.

Где я ошибаюсь?


person vandus    schedule 26.06.2014    source источник
comment
Вы храните во внутренней или внешней памяти?   -  person Haresh Chhelana    schedule 26.06.2014
comment
Я хочу хранить изображения, чтобы они были доступны пользователю в пользовательской папке, видимой в папке галереи.   -  person vandus    schedule 26.06.2014


Ответы (2)


Вот функция для сохранения изображения,

public static String saveImageInExternalCacheDir(Context context, Bitmap bitmap, String myfileName) {
    String fileName = myfileName.replace(' ', '_') + getCurrentDate().toString().replace(' ', '_').replace(":", "_");
    String filePath = (context.getExternalCacheDir()).toString() + "/" + fileName + ".jpg";
    try {
        FileOutputStream fos = new FileOutputStream(new File(filePath));
        bitmap.compress(Bitmap.CompressFormat.JPEG, 85, fos);
        fos.flush();
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return filePath;
}
person SHIDHIN.T.S    schedule 26.06.2014
comment
Тебе от этого стало лучше, ШИДХИ? - person Michael Petrotta; 30.06.2014

Вот действительно хороший пример -> Просто фотографировать.

Когда вы сохраняете с помощью функции createImageFile, вы можете выбрать URL-адрес своего каталога:

private File createImageFile() throws IOException {
// Create an image file name
timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = "JPEG_" + timeStamp + "_";
File storageDir = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES);]
File image = File.createTempFile(
    imageFileName,
    ".jpg",
    storageDir
);
mCurrentPhotoPath = "file:" + image.getAbsolutePath();
return image;
}

Я думаю, это то, что вам нужно!

person Agostinhob07    schedule 26.06.2014
comment
Это именно то, что я использую, если вы посмотрите. Однако он не создает пользовательскую папку. - person vandus; 26.06.2014