Ответ 1
При сохранении и загрузке сначала необходимо получить корневой путь системы. Вот как я это сделаю.
File root = Environment.getExternalStorageDirectory();
File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");
У меня есть ImageView с намерениями с акциями (который отлично работает, отображает все приложения, с которыми я могу поделиться ими), однако я не могу поделиться фотографией, потому что у меня нет пути на моем телефоне. Как мне сэкономить ImageView на моем телефоне? Ниже мой код.
public void taptoshare(View v)
{
View content = findViewById(R.id.myimage);
content.setDrawingCacheEnabled(true);
Bitmap bitmap = content.getDrawingCache();
File file = new File("/DCIM/Camera/image.jpg");
try
{
file.createNewFile();
FileOutputStream ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, ostream);
ostream.close();
}
catch (Exception e)
{
e.printStackTrace();
}
Intent shareIntent = new Intent(Intent.ACTION_SEND);
Uri phototUri = Uri.parse("/DCIM/Camera/image.jpg");
shareIntent.setData(phototUri);
shareIntent.setType("image/*");
shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
startActivity(Intent.createChooser(shareIntent, "Share Via"));
}
}
UPDATE Хорошо, поэтому я понял это. Теперь у меня есть новый вопрос: как я могу сохранить этот образ в новой папке?
При сохранении и загрузке сначала необходимо получить корневой путь системы. Вот как я это сделаю.
File root = Environment.getExternalStorageDirectory();
File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");
Я столкнулся с несколькими решениями, которые не решают эту проблему.
Вот решение, которое сработало для меня. Один из них - это то, что вам нужно хранить изображения в общем или не-частном месте (http://developer.android.com/guide/topics/data/data-storage.html#InternalCache)
Многие предложения говорят, что хранить в кэше Apps
"private", но это, конечно же, невозможно получить через другие внешние приложения, в том числе общие намерения Share File, которые используются. Когда вы попробуете это, он запустится, но, например, dropbox сообщит вам, что файл больше не доступен.
/* ШАГ 1 - Сохраните файл растрового изображения локально, используя функцию сохранения файлов ниже. */
localAbsoluteFilePath = saveImageLocally(bitmapImage);
/* ШАГ 2 - Поделитесь нефинансовым абсолютным файловым путем с целью создания файла share/*/
if (localAbsoluteFilePath!=null && localAbsoluteFilePath!="") {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
Uri phototUri = Uri.parse(localAbsoluteFilePath);
File file = new File(phototUri.getPath());
Log.d("file path: " +file.getPath(), TAG);
if(file.exists()) {
// file create success
} else {
// file create fail
}
shareIntent.setData(phototUri);
shareIntent.setType("image/png");
shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
activity.startActivityForResult(Intent.createChooser(shareIntent, "Share Via"), Navigator.REQUEST_SHARE_ACTION);
}
/* СОХРАНИТЬ ФУНКЦИЮ ИЗОБРАЖЕНИЯ */
private String saveImageLocally(Bitmap _bitmap) {
File outputDir = Utils.getAlbumStorageDir(Environment.DIRECTORY_DOWNLOADS);
File outputFile = null;
try {
outputFile = File.createTempFile("tmp", ".png", outputDir);
} catch (IOException e1) {
// handle exception
}
try {
FileOutputStream out = new FileOutputStream(outputFile);
_bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.close();
} catch (Exception e) {
// handle exception
}
return outputFile.getAbsolutePath();
}
/* ШАГ 3 - Обращение с файлом. Необходим удаленный временный файл и т.д. */
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// deal with this with whatever constant you use. i have a navigator object to handle my navigation so it also holds all mys constants for intents
if (requestCode== Navigator.REQUEST_SHARE_ACTION) {
// delete temp file
File file = new File (localAbsoluteFilePath);
file.delete();
Toaster toast = new Toaster(activity);
toast.popBurntToast("Successfully shared");
}
}
/* UTILS */
public class Utils {
//...
public static File getAlbumStorageDir(String albumName) {
// Get the directory for the user public pictures directory.
File file =
new File(Environment.getExternalStorageDirectory(), albumName);
if (!file.mkdirs()) {
Log.e(TAG, "Directory not created");
}
return file;
}
//...
}
Я надеюсь, что это поможет кому-то.