Как сохранить ImageView как изображение? - PullRequest
10 голосов
/ 25 ноября 2011

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

4 голосов
/ 25 ноября 2011

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

File root = Environment.getExternalStorageDirectory();
File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");
1 голос
/ 06 февраля 2014

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

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

Многие предложения говорят о том, чтобы хранить в Apps «частном» месте кэша, но это, конечно, недоступно через другие внешние приложения, включая общее намерение Share File, которое используется. Когда вы попробуете это, он запустится, но, например, 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;
    }   
    //...
}

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

...