Как сохранить ImageView как изображение?

У меня есть 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"));

}   
}

обновление Ладно, я понял. Теперь у меня есть новый вопрос, как я могу сохранить это изображение в новую папку?

2 ответов


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

File root = Environment.getExternalStorageDirectory();
File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");

я столкнулся с несколькими решениями, которые не решают эту проблему.

вот решение, которое сработало для меня. One gotcha-вам нужно хранить изображения в общем или не частном месте приложения (http://developer.android.com/guide/topics/data/data-storage.html#InternalCache)

многие предложения говорят, чтобы хранить в Apps" частное " расположение кэша, но это, конечно, не доступно через другие внешние приложения, включая общие Share намерение файла, который используется. Когда вы попробуете это, он будет работать, но, например, dropbox скажет вам, что файл больше не доступен.

/* Шаг 1-сохранить растровый файл локально с помощью функции сохранения файла ниже. */

localAbsoluteFilePath = saveImageLocally(bitmapImage);

/* Шаг 2-Поделитесь не частным абсолютным путем к файлу общего доступа*/

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's public pictures directory.
        File file = 
            new File(Environment.getExternalStorageDirectory(), albumName);
        if (!file.mkdirs()) {
            Log.e(TAG, "Directory not created");
        }
        return file;
    }   
    //...
}

надеюсь, это кому-то поможет.