Передача битмаба обратно от активности к фрагменту - PullRequest
0 голосов
/ 18 июня 2020
• 1000 активность и go обратно к фрагменту с данными растрового изображения.

Я пытался использовать намерения и пакеты, но ничего не помогло.

Ответы [ 3 ]

0 голосов
/ 18 июня 2020

Передача объекта Bitmap через намерения пакета очень опасна, и вы можете получить ошибки, особенно для растровых изображений неизвестной длины, поскольку существует даже ограничение на размер Parcelable extra. Это крайне не рекомендуется. Лучшим решением было бы его сохранить в файл затем укажите путь к строковому значению и передайте его следующему действию или даже общему предпочтению на тот случай, если оно может понадобиться даже после закрытия приложения или даже где-то в другом месте вашего кода без использования вашей памяти. серьезная угроза памяти при неправильном обращении. См.

public class Bitmap_saver{


public static String my_bitmap_path(Context act) {

    SharedPreferences prefs = act.getSharedPreferences("SHAREDpREFname", act.MODE_PRIVATE);
    return prefs.getString("my_bitmap_address", null);

}

public static void set_my_bitmap_address(Context act, String path) {

    SharedPreferences.Editor saver = act.getSharedPreferences("SHAREDpREFname", act.MODE_PRIVATE).edit();

    saver.putString("my_bitmap_address", path);
    saver.commit();

}
public static String save_to_file(Bitmap fpb)
{
    String img_name="BIT_"+ System.currentTimeMillis()+".JPG";

    OutputStream fOutputStream = null;

    File file = new File( Environment.getExternalStorageDirectory().toString() + "/YOUR_APP_DATA/");
    if (!file.exists()) {
        Log.e("Creating data dir=>",""+ String.valueOf(file.mkdirs()));
    }

    file = new File(Environment.getExternalStorageDirectory().toString() + "/YOUR_APP_DATA/", img_name);

    try {
        fOutputStream = new FileOutputStream(file);

        fpb.compress(Bitmap.CompressFormat.JPEG, 100, fOutputStream);

        fOutputStream.flush();
        fOutputStream.close();


    } catch (FileNotFoundException e) {
        e.printStackTrace();

         return "error";
    } catch (IOException e) {
        e.printStackTrace();

        //   Toast.makeText(this, "Save Failed", Toast.LENGTH_SHORT).show();
        return "error";
    }
    return file.getAbsolutePath();
}

}

Назовите это так, чтобы спасти Bitmap_saver.set_my_bitmap_path(your_context,Bitmap_saver.save_to_file(your_bitmap));

от получаемого фрагмента / действия / класса, назовите это Bitmap myBitmap = BitmapFactory.decodeFile(Bitmap_saver.my_bitmap_path(your_context));

0 голосов
/ 21 июня 2020

Я использую такой подход:

  1. в вашем фрагменте:

     Intent signatureIntent = new Intent(getActivity(), SignatureActivity.class);
     startActivityForResult(signatureIntent, your_request_code);
    
     @Override
     public void onActivityResult(int requestCode, int resultCode,
                                  @Nullable Intent data) {
     super.onActivityResult(requestCode, resultCode, data);
         if(requestCode == your_request_code&& resultCode == Activity.RESULT_OK){
    
             String received = data.getStringExtra("extra");
             byte[] decodedString = Base64.decode(received, Base64.DEFAULT);
             Bitmap decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, 
             decodedString.length);
        }
    }
    
  2. в вашей деятельности:

     bitmap = signatureView.getSignatureBitmap();
     Intent resultIntent = new Intent();
    
      ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
      byte[] byteArray = byteArrayOutputStream.toByteArray();
      String encoded = Base64.encodeToString(byteArray, Base64.DEFAULT);
    
      resultIntent .putExtra("extra",encoded);
      setResult(Activity.RESULT_OK, resultIntent);
      finish();
    
0 голосов
/ 18 июня 2020

Вам необходимо преобразовать данные Bitmap в массив byte, а затем поместить их в Bundle

ByteArrayOutputStream mStream = new ByteArrayOutputStream();
yourBitmapImage.compress(Bitmap.CompressFormat.PNG, 100, mStream);
byte[] byteArray = mStream.toByteArray();

Bundle mBundle = new Bundle();
mBundle.putByteArray("image",byteArray);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...