у меня есть страница просмотра изображений, и я хочу добавить кнопку, чтобы поделиться изображением из ImageView - PullRequest
0 голосов
/ 23 мая 2019

Я попробовал код в 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)

1 Ответ

0 голосов
/ 23 мая 2019

Вы можете поделиться изображением с другим приложением, не сохраняя в мобильном телефоне

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

// 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;
}

Я надеюсь, что это поможет, и не забудьте прочитать комментарий в коде, чтобы узнать, что вы хотите

...