Как сохранить новое изображение кнопки изображения и загрузить вновь созданное изображение кнопки изображения при повторном запуске - PullRequest
0 голосов
/ 08 ноября 2019

Я пытаюсь перезагрузить изображение, которое я получаю из моей галереи или камеры в кнопке изображения после закрытия приложения

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




public class HomeFragment extends Fragment {


    ImageButton profilePic;

    Drawable myDrawable;
    Bitmap bitmap ;




    String photoPath = Environment.getExternalStorageDirectory().toString();

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
               View root = inflater.inflate(R.layout.fragment_home, container, false);



       profilePic = (ImageButton) root.findViewById(R.id.imageButton);
        myDrawable = profilePic.getBackground();
        bitmap = drawableToBitmap(myDrawable);


// set up listener on ImageButton to load method changeProfilePicture() when user clicks profilePic
        profilePic.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

                changeProfilePicture();
            }
        });


        int Permission_All = 1;

        String[] Permissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
        if(!hasPermissions(getActivity(), Permissions)){
            ActivityCompat.requestPermissions(getActivity(), Permissions, Permission_All);

        }


       loadImageFromStorage(photoPath);
        return root;

    }


    public void onResume() {

        super.onResume();

        loadImageFromStorage(photoPath);

    }

    public void onStart() {

        super.onStart();

    }

    public void onPause() {

        super.onPause();


    }

    public void onStop() {

        super.onStop();

        saveBitmap(bitmap);
    }

    public void onDestroy() {

        super.onDestroy();


    }

    static final int REQUEST_IMAGE_CAPTURE = 1;
    static final int REQUEST_GALLERY = 0;

    //create changeProfilePicture method and call it when the  ImageButton is pressed
    public void changeProfilePicture() {

// add alert dialog to ask user how they would like to change their profile icon



    }


    // override onActivityResult to allow the imageButton to be changed to picture taken from camera or gallery

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if(resultCode == RESULT_OK) {
            //create a switch based on requestCode
            switch (requestCode) {
                // if user clicks change profilePic through gallery use picture user picked from gallery
                case REQUEST_GALLERY:
                    Uri galleryImage = data.getData();
                    try {
                        Bitmap galleryBitmap = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), galleryImage);
                        galleryBitmap = Bitmap.createScaledBitmap(galleryBitmap, 200, 200, false);
                        profilePic.setImageBitmap(galleryBitmap);
                       saveBitmap(galleryBitmap);
                    } catch (IOException e) {
                        Log.i("TAG", "Exception " + e);
                    }

                    break;
                // if user clicks change profilePic through camera use picture user took from camera app

                case REQUEST_IMAGE_CAPTURE:

                    Bundle extras = data.getExtras();
                    Bitmap imageBitmap = (Bitmap) extras.get("data");
                    imageBitmap = Bitmap.createScaledBitmap(imageBitmap, 200, 200, false);
                    profilePic.setImageBitmap(imageBitmap);
                    saveBitmap(imageBitmap);

                    break;
            }

        }
    }



    private void saveBitmap(Bitmap bm){
        File file = Environment.getExternalStorageDirectory();
        File newFile = new File(file, "myImage.jpg");

        try {
            FileOutputStream fileOutputStream = new FileOutputStream(newFile);
            bm.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
            fileOutputStream.flush();
            fileOutputStream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        Log.i( "getExternalStorageDirectory", file.getPath()) ;
    }

    private void loadImageFromStorage(String path)
    {

        try {
            File f=new File(path, "myImage.jpg");
            Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
            profilePic.setImageBitmap(b);
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }

    }

    public static Bitmap drawableToBitmap (Drawable drawable) {
        Bitmap bitmap = null;

        if (drawable instanceof BitmapDrawable) {
            BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
            if(bitmapDrawable.getBitmap() != null) {
                return bitmapDrawable.getBitmap();
            }
        }

        if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
            bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
        } else {
            bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        }

        Canvas canvas = new Canvas(bitmap);
        drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
        drawable.draw(canvas);
        return bitmap;
    }

    public static boolean hasPermissions(Context context, String... permissions)
    {

        if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M && context!=null && permissions!=null){
            for(String permission: permissions){
                if(ActivityCompat.checkSelfPermission(context, permission)!= PackageManager.PERMISSION_GRANTED){
                    return  false;
                }
            }
        }
        return true;
    }

}



// what I have for my ImageButton in xml

   <ImageButton
        android:id="@+id/imageButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:contentDescription="@string/profilePic"
        android:onClick="changeProfilePicture"
        android:paddingLeft="0dp"
        android:paddingTop="0dp"
        android:paddingRight="0dp"
        android:paddingBottom="0dp"
        android:layout_marginTop="2dp"
        android:layout_marginBottom="5dp"
        android:background="#0000"
        app:srcCompat="@mipmap/ic_launcher_round" />

I have the following permissions inside the manifest.xml 

 <uses-feature
        android:name="android.hardware.camera"
        android:required="true" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Я пытаюсь сохранить новый ImageButton из моего результата и загрузить его при перезапуске приложения. Можно ли это сделать с помощью ImageButton? Можно ли сохранить и загрузить из файла?

1 Ответ

0 голосов
/ 08 ноября 2019

В качестве первого шага вам нужно получить растровое изображение из imageButton, например,

Bitmap bitmap = ((BitmapDrawable)imageButton.getDrawable()).getBitmap();

Затем вам нужно сохранить это растровое изображение во внешнем хранилище, например,

private void saveBitmap(Bitmap bm){
    File file = Environment.getExternalStorageDirectory();
    File newFile = new File(file, "myImage.jpg");

    try {
        FileOutputStream fileOutputStream = new FileOutputStream(newFile);
        bm.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);
        fileOutputStream.flush();
        fileOutputStream.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
* 1007. * И вы загружаете это сохраненное растровое изображение следующим образом
private void loadImageFromStorage(String path)
{

    try {
        File f=new File(path, "myImage.jpg");
        Bitmap b = BitmapFactory.decodeStream(new FileInputStream(f));
        imageButton.setImageBitmap(b);
    } 
    catch (FileNotFoundException e) 
   {
    e.printStackTrace();
   }

}

Вы должны определить путь к изображению следующим образом

String photoPath = Environment.getExternalStorageDirectory() + "/myImage.jpg";

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

Надеюсь, это то, что вы ищете.

ОБНОВЛЕНИЕ:

Вам нужно изменить эту строку

Bitmap bitmap = ((BitmapDrawable)imageButton.getDrawable()).getBitmap();

К этому

Drawable myDrawable = imageButton.getBackground();

После этого вы преобразуете Drawable в Bitmap

Bitmap bitmap = drawableToBitmap(myDrawable);

Вот функция для этого преобразования

public static Bitmap drawableToBitmap (Drawable drawable) {
    Bitmap bitmap = null;

    if (drawable instanceof BitmapDrawable) {
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        if(bitmapDrawable.getBitmap() != null) {
            return bitmapDrawable.getBitmap();
        }
    }

    if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
        bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); 
    } else {
        bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
    }

    Canvas canvas = new Canvas(bitmap);
    drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
    drawable.draw(canvas);
    return bitmap;
}

ОБНОВЛЕНИЕ 2:

Вам необходимо запросить разрешения во время выполнения для сохранения и получения изображений Сначала вам нужно добавить это в свой файл манифеста

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

Затем добавьте этот метод вваша деятельность

public static boolean hasPermissions(Context context, String... permissions)
{

    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M && context!=null && permissions!=null){
        for(String permission: permissions){
            if(ActivityCompat.checkSelfPermission(context, permission)!= PackageManager.PERMISSION_GRANTED){
                return  false;
            }
        }
    }
    return true;
}

Наконец в вашем onCreate добавьте эти строки

int Permission_All = 1;

    String[] Permissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
    if(!hasPermissions(this, Permissions)){
        ActivityCompat.requestPermissions(this, Permissions, Permission_All);
    }
...