当前位置: 首页 > 知识库问答 >
问题:

共享并保存ImageView的图像?

吉凯捷
2023-03-14

我的应用程序有两个按钮,一个用于共享图像,另一个用于将其保存到内存,保存按钮工作正常,但共享按钮不工作。

这是保存按钮:

public void exportImage () {
    if (this.mImageDrawableSet == false) {
        this.mSaveImageOnDisplay = true;
        return;
    }

    try {
        final Bitmap bitmap = getImageBitmap();
        if (bitmap == null) {
            Toast.makeText(getActivity(), "Something Went Wrong, Please Try Again!", Toast.LENGTH_SHORT).show();
            return;
        }

        final File dir = new File(Environment.getExternalStorageDirectory(), super.getResources().getString(R.string.config_external_storage_folder));

        if (!dir.exists()) {
            dir.mkdirs();
        }

        final File img = new File(dir, this.mNode.name + ".png");
        if (img.exists()) {
            img.delete();
        }

        final OutputStream outStream = new FileOutputStream(img);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
        outStream.flush();
        outStream.close();

        super.getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + dir.toString())));
        Toast.makeText(getActivity(), "Wallpaper Saved To, " + img.toString() + "!", Toast.LENGTH_LONG).show();
    } catch (Exception e) {
        Log.e(TAG, "", e);
        Toast.makeText(getActivity(), "Something Went Wrong, Please Try Again!", Toast.LENGTH_SHORT).show();
    }
}

下面是分享部分:

public void shareimage () {
    if (this.mImageDrawableSet == false) {
        this.mApplyImageOnDisplay = true;
        return;
    }

    try {
        final Bitmap bitmap = getImageBitmap();
        if (bitmap == null) {
            Toast.makeText(getActivity(), "Something Went Wrong, Please Try Again!", Toast.LENGTH_SHORT).show();
            return;
        }       
        File root = Environment.getExternalStorageDirectory();
        File cachePath = new File(root.getAbsolutePath() + "/DCIM/Camera/image.jpg");

            cachePath.createNewFile();
            FileOutputStream ostream = new FileOutputStream(cachePath);
            bitmap.compress(CompressFormat.JPEG, 100, ostream);
            ostream.close();
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("image/*");
            share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(cachePath));
            startActivity(Intent.createChooser(share,"Share via"));
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getActivity(), "Something Went Wrong, Please Try Again!", Toast.LENGTH_SHORT).show();
        }
    }

logcat上什么也没有显示,我只是得到了一些错误的吐司。权限正确。

Logcat

02-15 16:10:50.527: W/System.err(2033):     at      android.support.v4.app.Watson.onMenuItemSelected(Watson.java:126)
02-15 16:10:50.539: W/System.err(2033):     at com.actionbarsherlock.ActionBarSherlock.callbackOptionsItemSelected(ActionBarSherlock.java:604)
02-15 16:10:50.539: W/System.err(2033):     at com.actionbarsherlock.internal.ActionBarSherlockNative.dispatchOptionsItemSelected(ActionBarSherlockNative.java:92)
02-15 16:10:50.539: W/System.err(2033):     at com.actionbarsherlock.app.SherlockFragmentActivity.onMenuItemSelected(SherlockFragmentActivity.java:204)
02-15 16:10:50.539: W/System.err(2033):     at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:986)
02-15 16:10:50.539: W/System.err(2033):     at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
02-15 16:10:50.539: W/System.err(2033):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
02-15 16:10:50.539: W/System.err(2033):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
02-15 16:10:50.539: W/System.err(2033):     at com.android.internal.view.menu.ActionMenuView.invokeItem(ActionMenuView.java:547)
02-15 16:10:50.539: W/System.err(2033):     at com.android.internal.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:115)
02-15 16:10:50.539: W/System.err(2033):     at android.view.View.performClick(View.java:4240)
02-15 16:10:50.539: W/System.err(2033):     at android.view.View$PerformClick.run(View.java:17721)
02-15 16:10:50.543: W/System.err(2033):     at android.os.Handler.handleCallback(Handler.java:730)
02-15 16:10:50.543: W/System.err(2033):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-15 16:10:50.543: W/System.err(2033):     at android.os.Looper.loop(Looper.java:137)
02-15 16:10:50.543: W/System.err(2033):     at android.app.ActivityThread.main(ActivityThread.java:5103)
02-15 16:10:50.543: W/System.err(2033):     at java.lang.reflect.Method.invokeNative(Native Method)
02-15 16:10:50.543: W/System.err(2033):     at java.lang.reflect.Method.invoke(Method.java:525)
02-15 16:10:50.543: W/System.err(2033):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
02-15 16:10:50.551: W/System.err(2033):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
02-15 16:10:50.551: W/System.err(2033):     at dalvik.system.NativeStart.main(Native Method)
02-15 16:10:50.551: W/System.err(2033): Caused by: libcore.io.ErrnoException: open failed: ENOENT (No such file or directory)
02-15 16:10:50.555: W/System.err(2033):     at libcore.io.Posix.open(Native Method)
02-15 16:10:50.555: W/System.err(2033):     at libcore.io.BlockGuardOs.open(BlockGuardOs.java:110)
02-15 16:10:50.555: W/System.err(2033):     at java.io.File.createNewFile(File.java:941)
02-15 16:10:50.559: W/System.err(2033):     ... 23 more

共有3个答案

戈嘉慕
2023-03-14

我现在在胡乱猜测,但看起来像这样:

File root = Environment.getExternalStorageDirectory();

你忘了打电话了

root.mkdirs();

之后我的意思是,你确定在你的代码中你的文件目录存在吗?

苏振国
2023-03-14

我想我的代码较小,因为它使用Context MODE\u WORLD\u READABLE中的方法作为临时文件,不需要任何权限:

    ImageView iv = (ImageView )adapter.getmCurrentView();
    String fileName = "image.jpg";
    iv.setDrawingCacheEnabled(true);
    Bitmap bitmap = iv.getDrawingCache();
    try
    {
        FileOutputStream ostream = getActivity().openFileOutput( fileName, Context.MODE_WORLD_READABLE);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
        ostream.close();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("image/*");
    share.putExtra(Intent.EXTRA_SUBJECT, "Great photo from Poland!");
    share.putExtra(Intent.EXTRA_TEXT, "Hi,  I'm sharing with you this great picture!");
    share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile( new File( getActivity().getFileStreamPath( fileName).getAbsolutePath())));
    startActivity(Intent.createChooser(share,"Share via"));
施越彬
2023-03-14

我找到了它,以防有人需要它最终shareimage()

public void shareimage () {
    if (this.mImageDrawableSet == false) {
        this.mApplyImageOnDisplay = true;
        return;
    }

    try {
        final Bitmap bitmap = getImageBitmap();
        if (bitmap == null) {
            Toast.makeText(getActivity(), "Something Went Wrong, Please Try Again!1", Toast.LENGTH_SHORT).show();
            return;
        }       
        final File dir = new File(Environment.getExternalStorageDirectory(), super.getResources().getString(R.string.config_external_storage_folder));

        if (!dir.exists()) {
            dir.mkdirs();
        }

        final File img = new File(dir, this.mNode.name + ".png");
        if (img.exists()) {
            img.delete();
        }
        final OutputStream outStream = new FileOutputStream(img);
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
        outStream.flush();
        outStream.close();
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("image/*");
            share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(img));
            startActivity(Intent.createChooser(share,"Share via"));
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getActivity(), "Something Went Wrong, Please Try Again!2", Toast.LENGTH_SHORT).show();
        }
    }
 类似资料:
  • 活动1:我有一个图像视图,其中从相机和画廊拍摄的图像被设置,它工作正常。在这个活动中有一个右键单击按钮,它将重定向到第二个活动。 活动2:在这个活动中,我有四个选择 保存 活动3:从上述四个选项中,第三个活动相应地工作。现在我不知道如何将第一个活动中拍摄的图像传递给第三个活动。 我的努力:在从相机拍摄的第一张活动图片中: 在第二个活动SaveVia中: 在第三个名为“保存”的活动中:

  • 我正在尝试构建一个JavaFX应用程序,其中我有一个名为“Start”的按钮和一个ImageView。使用JavaFX-12的机器人类,我正在尝试在单击按钮时截取笔记本电脑屏幕的屏幕截图,并在ImageView中的运行时逐一显示图像。我的问题是JavaFX窗口没有响应,程序崩溃(可能)。甚至让线程进入睡眠状态似乎也不起作用。我假设它不起作用,因为我没有设置任何fps规则,但我怎么能这样做呢?目前,

  • 我在共享首选项中保存列表并将其显示在列表视图中没有问题,但我的问题是当我重新启动应用程序并尝试将项目添加到列表视图时 旧的存储项目已删除.有我的代码: } public void getDates(){

  • 谢谢你花时间阅读这篇文章。 我看了无数的帖子在这个论坛,但仍然无法实现什么是想要的。 我的想法是创建一个save.php脚本,在服务器上没有提示地保存.png文件,或者在我按时创建一个假url 弹出窗口加载后,我的img url将 这是我找到的封闭示例 示例1导致示例2 示例2保存base64 示例3将画布保存为JPG或PNG 示例4非常接近于下面的答案

  • 我正在制作一个soundboard应用程序,当长按按钮1时,我需要共享sound1。我可以用以下代码创建共享菜单: 我可以与whatsapp和Google Drive完美共享音频文件,但其他应用程序不起作用。我听说您必须将文件复制到外部存储,并从那里共享它们。我已经搜索了将近两天,但我找不到这样做的方法。Stack上的其他文章也帮不了我:/ 如何在外部存储器中创建目录,将文件(sound1.ogg

  • 共享内存是两个或多个进程共享的内存。 但是,为什么我们需要共享内存或其他通信方式呢? 重申一下,每个进程都有自己的地址空间,如果任何进程想要将自己的地址空间的某些信息与其他进程进行通信,那么只能通过IPC(进程间通信)技术进行。 我们已经知道,通信可以在相关或不相关的进程之间进行。 通常,使用管道或命名管道来执行相互关联的进程通信。 可以使用命名管道或通过共享内存和消息队列的常用IPC技术执行无关