Я пытаюсь открыть почтовый клиент с прикрепленным изображением или, может быть, больше, которое было ранее снято с камеры. Изображения сохраняются на устройстве, но я не могу найти путь. Я фиксирую и сохраняю изображения с этим кодом:
private void takePhoto() {
output=new File(new File(getFilesDir(), PHOTOS), FILENAME);
if (output.exists()) {
output.delete();
}
else {
output.getParentFile().mkdirs();
}
Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri outputUri= FileProvider.getUriForFile(this, AUTHORITY, output);
i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) {
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
else if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.JELLY_BEAN) {
ClipData clip=
ClipData.newUri(getContentResolver(), "A photo", outputUri);
i.setClipData(clip);
i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
else {
List<ResolveInfo> resInfoList=
getPackageManager()
.queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
grantUriPermission(packageName, outputUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
}
}
try {
startActivityForResult(i, CONTENT_REQUEST);
}
catch (ActivityNotFoundException e) {
Toast.makeText(this, "no camera", LENGTH_LONG).show();
finish();
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable(EXTRA_FILENAME, output);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == CONTENT_REQUEST) {
if (resultCode == RESULT_OK) {
Uri outputUri=FileProvider.getUriForFile(this, AUTHORITY, output);
saveBitmap(getContactBitmapFromURI(this, outputUri));
mData.add(new AttachedImage(FileName, FileSize,PathFromCamera));
mAdapter.notifyDataSetChanged();
}
}
}
public Bitmap getContactBitmapFromURI(Context context, Uri uri) {
try {
InputStream input = context.getContentResolver().openInputStream(uri);
if (input == null) {
return null;
}
return BitmapFactory.decodeStream(input);
}
catch (FileNotFoundException e)
{
}
return null;
}
public void saveBitmap(Bitmap bitmap){
String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HHmmss").format(new Date());
ContextWrapper wrapper = new ContextWrapper(getBaseContext());
File file = wrapper.getDir("Images",MODE_PRIVATE);
file = new File(file, timeStamp+".jpg");
try{
OutputStream stream = null;
stream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
stream.flush();
stream.close();
}catch (IOException e)
{
e.printStackTrace();
}
Uri savedImageURI = Uri.parse(file.getAbsolutePath());
PathFromCamera = savedImageURI.getEncodedPath(); //this will be returned with the getImage() method
FileSize = String.valueOf((file.length()/1024)/1000) + " KB";
FileName = file.getName();
}
Я хочу отправить электронное письмо с помощью этого OnClickListener:
mSubmit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent emailIntent = new Intent(Intent.ACTION_SEND);
emailIntent.setType("text/plain");
emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"email@example.com"});
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "example");
emailIntent.putExtra(Intent.EXTRA_TEXT, mLocation.getText().toString() + "\n" + mSpinner.getSelectedItem().toString() + "\n" + mDetail.getText().toString());
for (final AttachedImage img : mData) {
//System.out.println(img.getImage());
//Bitmap bitmap = BitmapFactory.decodeFile(img.getImage());
File f = new File(img.getImage());
Uri outputUri=FileProvider.getUriForFile(getApplicationContext(), AUTHORITY, f);
emailIntent.putExtra(Intent.EXTRA_STREAM, outputUri);
}
startActivity(Intent.createChooser(emailIntent, "Pick an Email provider"));
}
});
. Функция .getImage () возвращает переменную PathFromCamera, которая была сохранена когда изображение было снято. Я знаю, что эта функция возвращает существующий путь, потому что я загружаю изображения в RecyclerView, и там он работает отлично. Код, который я использую в RecyclerViewAdapter для загрузки изображения, выглядит следующим образом:
AttachedImage currentItem = mData.get(position);
holder.mImageView.setImageBitmap(BitmapFactory.decodeFile(currentItem.getImage()));
Я храню все изображения в private List<AttachedImage> mData;
AttachedImage - созданный пользовательский класс. У меня также есть провайдер файлов:
public class LegacyCompatFileProvider extends FileProvider {
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
return(new CursorWrapper(super.query(uri, projection, selection, selectionArgs, sortOrder)));
}
}
И файл xml:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="p"
path="photos" />
</paths>
Файл My Manifest:
<provider
android:name=".custom.LegacyCompatFileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>