Я пишу простую галерею на Android с помощью эмулятора и сейчас пытаюсь реализовать функциональность, позволяющую делать фотографии прямо из приложения.
Я сохраняю фотографии прямо в /storage/emulated/0/DCIM/Camera/
, но проблема в том, что ни одно приложение не может получить доступ к вновь созданным фотографиям.Я имею в виду, что я не вижу эти фотографии в фотографиях Google, во встроенной галерее и, конечно, в моем приложении.
Но я могу найти эти фотографии с помощью встроенного файлового обозревателя.
Есть куча созданных фотографий в /storage/emulated/0/DCIM/Camera/
Но, например, если я создаю фотографию, используя стандартную встроенную камеру приложения(Я создал 3 из них). Фотография Google видит только их, но не те, которые я создал в своем приложении.
Если ясделайте правильно, когда я делаю фотографию с помощью стандартной камеры, она сохраняется в /storage/emulated/0/DCIM/Camera/
. Но почему при создании фотографий в этой папке вручную они не обнаруживаются никакими приложениями?
Код для фотографирования из моего приложения:
public class TakePhotoActivity extends AppCompatActivity {
Button takePicBtn;
ImageView takenImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.take_photo);
takePicBtn = findViewById(R.id.btnTakePic);
if (Build.VERSION.SDK_INT >= 23){
requestPermissions(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);
}
takePicBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dispatchTakePictureIntent();
galleryAddPic();
}
});
takenImageView = findViewById(R.id.takenImage);
}
static final int REQUEST_IMAGE_CAPTURE = 1;
@Override
protected void onActivityResult ( int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath);
takenImageView.setImageBitmap(bitmap);
}
}
String mCurrentPhotoPath;
private File createImageFile () throws IOException {
String name = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), "Camera");
File image = File.createTempFile(
"IMG_" + name, /* prefix */
".jpeg", /* suffix */
storageDir /* directory */
);
mCurrentPhotoPath = image.getAbsolutePath();
return image;
}
public void dispatchTakePictureIntent () {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
ex.printStackTrace();
}
if (photoFile != null) {
System.out.println(BuildConfig.APPLICATION_ID + ".fileprovider");
System.out.println(FileProvider.getUriForFile(TakePhotoActivity.this, BuildConfig.APPLICATION_ID + ".fileprovider", photoFile));
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, FileProvider.getUriForFile(TakePhotoActivity.this, BuildConfig.APPLICATION_ID + ".fileprovider", photoFile));
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
}
}
private void galleryAddPic () {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
mediaScanIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
mediaScanIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
File f = new File(mCurrentPhotoPath);
System.out.println(mCurrentPhotoPath);
Uri contentUri = FileProvider.getUriForFile(TakePhotoActivity.this, BuildConfig.APPLICATION_ID + ".fileprovider", f);
mediaScanIntent.setData(contentUri);
this.sendBroadcast(mediaScanIntent)
}
}
}
Частьманифест:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.stpmp">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera"
android:required="true" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>
Заранее спасибо!