从另一个 class onCreate 方法和 onActivityResult android 调用共享按钮图像

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

我的第一个问题是,android 中的每个新 class 都需要 onCreate 方法吗?

接下来我们能否使用多个onActivityResult方法而不造成失真 ?

例如我的 MainActivityShareActivity class 都有自己的 onActivityResult 和 Oncreate 方法(代码取自 git)

MainActivity 用于打开相机和图库

ShareActivity 用于分享拍摄的图像

注意:两者 class 首先检查权限

我想在我的 MainActivity 中调用 ShareActivity,合乎逻辑的做法是

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

但是我的ShareActivity也有这个

@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);
    }
}

然后我想这样称呼它

ShareActivity.getInstance().onShareTouched();

但应用程序总是崩溃,每次我调用分享 class,

编辑:我应该使用工具吗?

注意:Share class 在没有 MainActivity 的情况下工作正常(我在新项目中尝试过) 为了更好地理解,我将完整代码留在下面

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();
            }
        }
    }
}

我找到了一个更好更简单的方法 我不得不完全改变我的方法,我把所有东西都放在我的按钮 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();
            }
        }
    });

不需要 ShareActivity 效果很好