Я боролся с этим уже несколько дней, и другие ответы, опубликованные в аналогичных вопросах здесь, в 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.
Где я ошибаюсь?