简体   繁体   中英

Call a Share button Image from another class onCreate method and onActivityResult android

My first question would be, Is onCreate method needed on every new class in android?

Next, can we use multiple onActivityResult method without causing distortion?

For exemple my MainActivity and ShareActivity class both have their own onActivityResult and Oncreate method (code taken from git)

MainActivity is for opening camera and gallery

ShareActivity is for sharing images captured

Note: Both class check for permission first

I wanna call the ShareActivity in my MainActivity, the logical thing to do would be

share.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent myIntent = new Intent(MainActivity.this, ShareActivity.class);
            startActivity(myIntent);
        }
    });

But my ShareActivity also has this

@OnClick(R.id.open_share)
void onShareTouched() {
    boolean has_perms = EasyPermissions.hasPermissions(ShareActivity.this, perms);
    if (has_perms) {
        shareImageFromBitmap(this.bmp);
    } else {
        EasyPermissions.requestPermissions(
                ShareActivity.this,
                getString(R.string.rationale_storage),
                SHARE_STORAGE_PERMS_REQUEST_CODE,
                perms);
    }
}

And then I thought about calling it like this

ShareActivity.getInstance().onShareTouched();

But the app keep crashing, everytime I call the Share class,

Edit: Should I use implement?

Note:the Share class works fine without MainActivity (I tried in new project) for better understanding I leave the complete code below

ShareActivity

public class ShareActivity extends AppCompatActivity {

private static ShareActivity instance;

private static final String TAG = "ShareActivity";
private final int SHARE_STORAGE_PERMS_REQUEST_CODE = 900;
private final int RESULT_LOAD_IMG_REQUEST_CODE = 778;
private final String[] perms = { android.Manifest.permission.WRITE_EXTERNAL_STORAGE,  android.Manifest.permission.READ_EXTERNAL_STORAGE};
private static final String IMAGE_URL = null;
private Bitmap bmp;

@BindView(R.id.open_share)
SimpleDraweeView imageView2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    bmp = getBitmapFromUrl(IMAGE_URL);
    imageView2.setImageURI(Uri.parse(IMAGE_URL));

    instance = this;

}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == RESULT_LOAD_IMG_REQUEST_CODE  && resultCode == RESULT_OK) {
        List<Image> images =  ImagePicker.getImages(data);
        if(images.size() > 0) {
            String imagePath = images.get(0).getPath();
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.ARGB_8888;
            bmp = BitmapFactory.decodeFile(imagePath, options);
            imageView2.setImageURI(Uri.fromFile(new File(imagePath)));
        }
    }
}
@OnClick(R.id.open_share)
void onShareTouched() {
    boolean has_perms = EasyPermissions.hasPermissions(ShareActivity.this, perms);
    if (has_perms) {
        shareImageFromBitmap(this.bmp);
    } else {
        EasyPermissions.requestPermissions(
                ShareActivity.this,
                getString(R.string.rationale_storage),
                SHARE_STORAGE_PERMS_REQUEST_CODE,
                perms);
    }
}
@AfterPermissionGranted(SHARE_STORAGE_PERMS_REQUEST_CODE)
private void shareImageFromBitmap(Bitmap bmp) {
    Uri uri = getUriImageFromBitmap(bmp, ShareActivity.this);
    if(uri == null) {
        //Show no URI message
        return;
    }
    final Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.putExtra(Intent.EXTRA_TEXT, IMAGE_URL);
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    shareIntent.setType("image/png");
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(shareIntent, "Share image using"));
}
private Bitmap getBitmapFromUrl(String url) {
    Uri uri = Uri.parse(url);
    ImageRequest downloadRequest = ImageRequest.fromUri(uri);
    CacheKey cacheKey = DefaultCacheKeyFactory.getInstance().getEncodedCacheKey(downloadRequest, ShareActivity.this);
    if (ImagePipelineFactory.getInstance().getMainFileCache().hasKey(cacheKey)) {
        BinaryResource resource = ImagePipelineFactory.getInstance().getMainFileCache().getResource(cacheKey);
        byte[] data = null;
        try {
            data = resource.read();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return BitmapFactory.decodeByteArray(data, 0, data.length);
    }
    return null;
}
private Uri getUriImageFromBitmap(Bitmap bmp, Context context) {
    if(bmp == null)
        return null;
    Uri bmpUri = null;
    try {
        File file =  new File(context.getExternalFilesDir(Environment.DIRECTORY_PICTURES), "IMG_" + System.currentTimeMillis() + ".png");
        FileOutputStream out = new FileOutputStream(file);
        bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
        out.flush();
        out.close();
        bmpUri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", file);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bmpUri;
}

public static ShareActivity getInstance() {
    return instance;
}

}

MainActivity

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == Activity.RESULT_OK && data != null) {
        if (requestCode == OPEN_THING) {
            Uri uri = Objects.requireNonNull(data.getExtras()).getParcelable(ScanConstants.SCANNED_RESULT);
            Bitmap bitmap;
            try {
                bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                if (uri != null) {
                    getContentResolver().delete(uri, null, null);
                }
                scannedImageView.setImageBitmap(bitmap);

                FileOutputStream outputStream = null;
                File sdCard = Environment.getExternalStorageDirectory();
                File directory = new File(sdCard.getAbsolutePath() + "/Scan Documents");
                directory.mkdir();

                String filename = String.format("d.jpg", System.currentTimeMillis());
                File outFile = new File(directory, filename);

                Toast.makeText(this, "Image Saved Successfully", Toast.LENGTH_SHORT).show();

                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                intent.setData(Uri.fromFile(outFile));
                sendBroadcast(intent);

                try {
                    outputStream = new FileOutputStream(outFile);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
                    outputStream.flush();
                    outputStream.close();

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

I found a better easier way I had to completely change my method, I put everything in my button onClick

 share.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Drawable myDrawable = scannedImageView.getDrawable();
            Bitmap bitmap = ((BitmapDrawable)myDrawable).getBitmap();

            try{
                File file = new File(MainActivity.this.getExternalCacheDir(), "myImage.png");
                FileOutputStream fOut = new FileOutputStream(file);
                bitmap.compress(Bitmap.CompressFormat.PNG, 80, fOut);
                fOut.flush();
                fOut.close();
                file.setReadable(true, false);
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
                intent.setType("image/png");
                startActivity(Intent.createChooser(intent, "Share Image Via"));
            }catch (FileNotFoundException e){
                e.printStackTrace();
                Toast.makeText(MainActivity.this, "File not found", Toast.LENGTH_SHORT).show();
            }catch (IOException e){
                e.printStackTrace();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    });

No need ShareActivity it works great

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM