简体   繁体   English

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

[英]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?我的第一个问题是,android 中的每个新 class 是否都需要 onCreate 方法?

Next, can we use multiple onActivityResult method without causing distortion?接下来,我们可以使用多个onActivityResult方法而不会造成失真吗?

For exemple my MainActivity and ShareActivity class both have their own onActivityResult and Oncreate method (code taken from git)例如我的MainActivityShareActivity class 都有自己的 onActivityResult 和 Oncreate 方法(代码取自 git)

MainActivity is for opening camera and gallery MainActivity 用于打开相机和图库

ShareActivity is for sharing images captured ShareActivity 用于共享捕获的图像

Note: Both class check for permission first注意:class 都先检查权限

I wanna call the ShareActivity in my MainActivity, the logical thing to do would be我想在我的 MainActivity 中调用 ShareActivity,合乎逻辑的做法是

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但我的 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);
    }
}

And then I thought about calling it like this然后我想这样称呼它

ShareActivity.getInstance().onShareTouched();

But the app keep crashing, everytime I call the Share class,但是应用程序总是崩溃,每次我调用 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注意:共享 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();
            }
        }
    }
}

I found a better easier way I had to completely change my method, I put everything in my button onClick我找到了一个更好更简单的方法,我必须完全改变我的方法,我把所有东西都放在我的按钮 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不需要 ShareActivity 它工作得很好

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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