Подтвердить что ты не робот

Как сохранить 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"));

}   
}

UPDATE Хорошо, поэтому я понял это. Теперь у меня есть новый вопрос: как я могу сохранить этот образ в новой папке?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Вот решение, которое сработало для меня. Один из них - это то, что вам нужно хранить изображения в общем или не-частном месте (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;
    }   
    //...
}

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