[英]i have image view page and i want to add a button to share image from ImageView
我尝试使用ViewPictureActivity.java
的代码来共享图像,但我收到了很多错误。
public class ViewPictureActivity extends AppCompatActivity {
private static final String KEY_PICTURES = "pics";
private static final String KEY_REQUESTED_POS = "requestedPos";
private ArrayList<Integer> imageIDs;
private int currentPosition = -1;
private ImageView galleryPicture;
Bitmap bitmap;
private File imagePath;
@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_picture);
initToolbar();
galleryPicture = (ImageView) findViewById(R.id.galleryImage);
imageIDs = (ArrayList<Integer>) getIntent().getSerializableExtra(KEY_PICTURES);
currentPosition = getIntent().getIntExtra(KEY_REQUESTED_POS, 0);
changePicture(currentPosition);
final ImageButton previousItemButton = findViewById(R.id.previous_item_button);
previousItemButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v1) {
if (imageIDs != null && imageIDs.size() > 0 && currentPosition > 0) {
changePicture(--currentPosition);
}
}
});
final ImageButton nextItemButton = findViewById(R.id.next_item_button);
nextItemButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v1) {
if (imageIDs != null && imageIDs.size() > 0 && imageIDs.size() > currentPosition + 1) {
changePicture(++currentPosition);
} else {
Toast.makeText(getApplicationContext(), "No more pictures", Toast.LENGTH_SHORT).show();
}
}
});
final ImageButton btnshare = findViewById(R.id.btnShare);
btnshare.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
OutputStream output;
FrameLayout fm = (FrameLayout) findViewById(R.id.frm2);
Calendar cal = Calendar.getInstance();
Bitmap bitmap = Bitmap.createBitmap(fm.getWidth(),
fm.getHeight(), Config.ARGB_8888);
Canvas b = new Canvas(bitmap);
fm.draw(b);
File filepath = Environment.getExternalStorageDirectory();
File dir = new File(filepath.getAbsolutePath()
+ "/D_Envitation/");
dir.mkdir();
String imagename = "image" + cal.getTimeInMillis() + ".png";
// Create a name for the saved image
File file = new File(dir, imagename);
// Show a toast message on successful save
Toast.makeText(ViewPictureActivity.this, "Image Saved to SD Card",
Toast.LENGTH_SHORT).show();
try {
output = new FileOutputStream(file);
// Compress into png format image from 0% - 100%
bitmap.compress(Bitmap.CompressFormat.PNG, 100, output);
output.flush();
output.close();
}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Uri screenshotUri = Uri.fromFile(file);
Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/png");
share.putExtra(Intent.EXTRA_STREAM, screenshotUri);
startActivity(Intent.createChooser(share, "Share With"));
}
});
}
private void initToolbar() {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
Toolbar displayActToolbar = findViewById(R.id.simple_toolbar);
setSupportActionBar(displayActToolbar);
}
}
private void changePicture(int arrayPosition) {
//galleryPicture.setLayoutParams(new LinearLayout.LayoutParams(500,500));
//galleryPicture.setScaleType(ImageView.ScaleType.CENTER_CROP);
galleryPicture.setImageResource(imageIDs.get(arrayPosition));
}
// starter - to control passing and reading Extra in the same class
public static void start(Context context, ArrayList<Integer> imageIDs, int requestedPos) {
Intent starter = new Intent(context, ViewPictureActivity.class);
starter.putExtra(KEY_PICTURES, imageIDs);
starter.putExtra(KEY_REQUESTED_POS, requestedPos);
context.startActivity(starter);
//Log.d("ViewPictureActivity", "after start");
}
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.hal9000.gridgallery, PID: 23639
android.os.FileUriExposedException: file:///storage/emulated/0/D_Envitation/image1558562487343.png exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1958)
at android.net.Uri.checkFileUriExposed(Uri.java:2348)
at android.content.ClipData.prepareToLeaveProcess(ClipData.java:941)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9735)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9741)
at android.content.Intent.prepareToLeaveProcess(Intent.java:9720)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1609)
at android.app.Activity.startActivityForResult(Activity.java:4472)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
at android.app.Activity.startActivityForResult(Activity.java:4430)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at android.app.Activity.startActivity(Activity.java:4791)
at android.app.Activity.startActivity(Activity.java:4759)
at com.hal9000.gridgallery.ViewPictureActivity$3.onClick(ViewPictureActivity.java:139)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
您可以与其他应用共享图像,而无需保存到手机中
public void OnClickShare(View view){
Bitmap bitmap =getBitmapFromView(YourView);
try {
File file = new File(this.getExternalCacheDir(),"logicchip.png");
FileOutputStream fOut = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
file.setReadable(true, false);
//start share image with intent
final Intent intent = new Intent(android.content.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 (Exception e) {
e.printStackTrace();
}
}
以及从ImageView获取Bitmap的方法
// can replace parmeter with ImageView in your state
private Bitmap getBitmapFromView(View view) {
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
//or use #getDrawable with ImageView
Drawable bgDrawable =view.getBackground();
if (bgDrawable!=null) {
//has background drawable, then draw it on the canvas
bgDrawable.draw(canvas);
} else{
//does not have background drawable, then draw white background on the canvas
canvas.drawColor(Color.WHITE);
}
view.draw(canvas);
return returnedBitmap;
}
我希望这有帮助,不要忘记阅读代码中的注释,以了解您的需求
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.