【问题标题】:sharing image with whatsapp in android在android中与whatsapp共享图像
【发布时间】:2014-09-05 15:48:40
【问题描述】:

我在资产文件夹中有图像,需要与whatsapp应用程序共享它

我试过这段代码,它一直给我分享失败再试一次!怎么了?!

         Intent share = new Intent(Intent.ACTION_SEND);
      share.setType("image/*");
      share.setPackage("com.whatsapp"); 
    //  share.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("file:///assets/epic/adv.png"))); 
      share.putExtra(Intent.EXTRA_STREAM, Uri.parse("file:///assets/epic/adv.png"));
      this.startActivity(Intent.createChooser(share, "share_via"));

【问题讨论】:

    标签: android image share whatsapp


    【解决方案1】:

    这个通过whatsapp分享图片的代码对我来说很好用。

    public void shareImageWhatsApp() {
    
        Bitmap adv = BitmapFactory.decodeResource(getResources(), R.drawable.adv);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("image/jpeg");
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        adv.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
        File f = new File(Environment.getExternalStorageDirectory()
                + File.separator + "temporary_file.jpg");
        try {
            f.createNewFile();
            new FileOutputStream(f).write(bytes.toByteArray());
        } catch (IOException e) {
            e.printStackTrace();
        }
        share.putExtra(Intent.EXTRA_STREAM,
                Uri.parse( Environment.getExternalStorageDirectory()+ File.separator+"temporary_file.jpg"));
        if(isPackageInstalled("com.whatsapp",this)){
              share.setPackage("com.whatsapp"); 
              startActivity(Intent.createChooser(share, "Share Image"));
    
        }else{
    
            Toast.makeText(getApplicationContext(), "Please Install Whatsapp", Toast.LENGTH_LONG).show();
        }
    
    }
    
    private boolean isPackageInstalled(String packagename, Context context) {
        PackageManager pm = context.getPackageManager();
        try {
            pm.getPackageInfo(packagename, PackageManager.GET_ACTIVITIES);
            return true;
        } catch (NameNotFoundException e) {
            return false;
        }
    }
    

    【讨论】:

    • 你在哪个版本的android中使用了这个?在我的实验看来,这段代码失败了。
    【解决方案2】:

    你有几个问题。

    首先,file:///assets/ 在任何版本的 Android 上都不是有效的 Uri。你自己的应用可以通过file:///android_asset/引用自己的资产。

    其次,只有你可以通过file:///android_asset/访问自己的资产——你不能将这样的Uri传递给第三方应用。将文件从资产复制到内部存储并使用FileProvider,或者您可以尝试my StreamProvider 并尝试直接从assets/ 共享数据。

    第三,不能保证com.whatsapp 存在于设备上,或者com.whatsapp 将支持ACTION_SEND of file:/// Uri 的MIME 类型为image/* 的值,因此您可能会崩溃带有ActivityNotFoundException

    第四,用户可能希望通过 WhatsApp 以外的其他方式共享此图像。 Please allow the user to share where the user wants,通过从您的 Intent 中删除 setPackage() 调用。

    【讨论】:

    • 资源或 URL 中图像的 uri 怎么样?对于资源,我尝试使用 Uri.parse("android.resource://" + getPackageName() + "/" + imageResId) ,但它似乎不适用于 WhatsApp 和我尝试过的任何其他应用程序。看这里:stackoverflow.com/q/18502598/878126,我认为这是不可能的。是否可以使用 FileProvider?有简单的方法吗?
    • @androiddeveloper:我不建议尝试共享依赖于配置的资源(例如,随密度变化的可绘制对象)。 android.resource 如何处理这个是无证的 AFAIK,它不像 WhatsApp 接收者想要发送者可能发送的特定可绘制对象(例如,ldpimdpi 设备的低分辨率图像)。我的StreamProvider 支持原始资源,您可以创建自己的ContentProvider 来提供任何您想要的服务。 FileProvider 根本不提供资源。
    • 好吧,如果我愿意的话,我可以将图像放在 assets 文件夹或 drawable-nodpi 中……这些有什么好的选择吗? (互联网上某处的)网址呢?
    • @androiddeveloper:除非你的 UI 中需要图片,否则我会使用 assets。我的StreamProvider 支持从资产提供服务,或者您可以自己创建一个ContentProvider 来处理这个问题。 “(互联网上某处的)网址呢?” - 一些应用程序可能支持这一点,而其他应用程序可能不支持。 file 一直是最安全的方案,直到 7.0。 ACTION_SEND 响应者应该至少支持 filecontent。他们是否支持httpshttpandroid.resource 会有所不同。不幸的是,我们无法对此进行过滤,所以 YMMV。
    • @androiddeveloper:我的 CWAC-Provider 库是 here,其中包含说明和演示应用程序,其中包括演示服务资产。您还会在我的一些图书样本中看到它使用它,例如this one for drag-and-drop
    【解决方案3】:

    这对我有用

    Bitmap imgBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.image);
    String imgBitmapPath= MediaStore.Images.Media.insertImage(getContentResolver(),imgBitmap,"title",null);
    Uri imgBitmapUri=Uri.parse(imgBitmapPath);
    Intent shareIntent=new Intent(Intent.ACTION_SEND);
    shareIntent.setType("image/*");
    shareIntent.putExtra(Intent.EXTRA_STREAM,imgBitmapUri);
    startActivity(Intent.createChooser(shareIntent,"share image using"));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-20
      • 2016-09-09
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      相关资源
      最近更新 更多