Сохранение растрового изображения во внутреннем/внешнем хранилище в студии Android

Я сделал приложение для рисования в Android Studio. как я могу сохранить рисунок во внутренней памяти и потом просмотреть его в другом действии? У меня есть несколько кодов в Интернете о том, как сохранить растровое изображение, но это не сработает, и я не знаю, что я сделал неправильно. Я уже застрял в этой части.

Вот некоторые из кодов:

public onClick(View v){

if(v.getId() == R.id.btnBrush){
.....
}

else if(v.getId() == R.id.btnErase){
.....
}

else if(v.getId() == R.id.ibtnSave){
        //save button clicked
        final Dialog saveDialog = new Dialog(this);
        saveDialog.setTitle("Save");
        saveDialog.setContentView(R.layout.save_form);
        saveDialog.show();



        inputName = (EditText) findViewById(R.id.drawFile);
        inputDate = (EditText) findViewById(R.id.date);
        btnSave = (Button) saveDialog.findViewById(R.id.btnSave);
        btnCancel = (Button) saveDialog.findViewById(R.id.btnCancel);

        btnSave.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                iView.setDrawingCacheEnabled(true);
                save();
                saveDialog.dismiss();

                Intent intent = new Intent(DrawingPanel.this, Gallery.class);
                startActivity(intent);
                finish();

                iView.destroyDrawingCache();


            }
        });

        btnCancel.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                saveDialog.dismiss();
            }
        });
    }
}

public void save(){
    Bitmap bitmap = iView.getDrawingCache();

    try{
        FileOutputStream fos = openFileOutput(inputName.getText().toString() + ".png", Context.MODE_PRIVATE);
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        if(fos != null){
            Toast saved = Toast.makeText(getApplicationContext(), "Image saved.", Toast.LENGTH_SHORT);
            saved.show();
        }
        else{
            Toast unsaved = Toast.makeText(getApplicationContext(), "Image not save.", Toast.LENGTH_SHORT);
            unsaved.show();
        }

        fos.close();
    }

    catch(Exception e){
        Log.e("save()", e.getMessage());
    }
}

Я тоже хочу добавить дату, но не знаю, как это сделать. Мне очень жаль, ребята. Я просто новичок в студии Android, и я не очень хорош в этом, поэтому мне нужна помощь, потому что я действительно хочу учиться.


person user3471140    schedule 09.04.2015    source источник
comment
Вы добавили разрешение в «manifest.xml»?   -  person Paritosh    schedule 09.04.2015
comment
inputName.getText().toString() . Вы должны точно сказать, что вы там напечатали.   -  person greenapps    schedule 09.04.2015
comment
it won't work. Ну тебе лучше сказать, что именно не работает. Как далеко течет ваш код? Какие-то исключения или ошибки?   -  person greenapps    schedule 09.04.2015
comment
if(fos != null). Это не говорит о том, что что-то было сохранено. Лучше проверьте возвращаемое значение bitmap.compress()..   -  person greenapps    schedule 09.04.2015


Ответы (1)


public void save(){

    Bitmap bitmap = iView.getDrawingCache();

    try{
    if(bitmap!=null){

        File file=new File(Environment.getExternalStorageDirectory()+"/dirr");
        if(!file.isDirectory()){
            file.mkdir();
        }

        file=new File(Environment.getExternalStorageDirectory()+"/dirr",inputName.getText()+"_"+System.currentTimeMillis()+".jpg");

        try 
        {
            FileOutputStream fileOutputStream=new FileOutputStream(file);
            if(bitmap.compress(Bitmap.CompressFormat.JPEG,100, fileOutputStream))
            {
                Toast saved = Toast.makeText(getApplicationContext(), "Image saved.", Toast.LENGTH_SHORT);
                saved.show();
            }
            else{
                Toast unsaved = Toast.makeText(getApplicationContext(), "Image not save.", Toast.LENGTH_SHORT);
                unsaved.show();
            }


        }
        catch(IOException e){
            e.printStackTrace();
        }
        finally {
             try {
               if (fileOutputStream!= null) {
                 // fileOutputStream.flush();
                  fileOutputStream.close();
               }
            } catch (IOException e) {
                   e.printStackTrace();
               }
       }

    }
        catch(Exception e){
            Log.e("save()", e.getMessage());
        }   
}

И добавьте разрешения в манифест:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

РЕДАКТИРОВАТЬ: Просто немного почистил код, а также вы можете взглянуть на похожие вопросы:

Сохранить растровое изображение в местоположении

Сохранить растровое изображение в файл и вернуть файл с растровым изображением

Как сохранить растровое изображение во внутренней памяти

person A B    schedule 09.04.2015
comment
if(fileOutputStream!= null). Неправильный. Вы должны проверить возвращаемое значение bitmap.compress. - person greenapps; 09.04.2015
comment
@AB, я попробовал ваши коды, но в конце есть ошибки с fileOutputStream. и это также говорит, что «наконец-то» без «попытки». - person user3471140; 10.04.2015
comment
Мне все еще нужна помощь в этом. это ничего не спасет. Он просто вылетает каждый раз, когда я пытаюсь сохранить. - person user3471140; 11.04.2015
comment
как я могу проверить возвращаемое значение bitmap.compress? - person user3471140; 11.04.2015
comment
и он говорит, что file.mkdir() игнорируется - person user3471140; 11.04.2015
comment
и у меня также возникает эта проблема всякий раз, когда я нажимаю на ошибку Edititext GetLabel! Исходное поведение фреймворка - person user3471140; 11.04.2015