xu-li / cordova-plugin-wechat

A cordova plugin, a JS version of Wechat SDK
1.22k stars 509 forks source link

分享时无法使用http链接图片 #399

Open lainlee opened 6 years ago

lainlee commented 6 years ago

您好,最近使用了这个微信插件,支付分享都没问题,不过分享时 thumb 选项用的是外链图片,最后报了permission 错误,如下

Logcat 报错

W/System.err: java.io.FileNotFoundException: /storage/emulated/0/cache/space-fxxj1.jpg-100x100 (Permission denied)
W/System.err:     at java.io.FileOutputStream.open(Native Method)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:169)
W/System.err:     at xu.li.cordova.wechat.Util.downloadAndCacheFile(Util.java:80)
W/System.err:     at xu.li.cordova.wechat.Wechat.getFileInputStream(Wechat.java:541)
W/System.err:     at xu.li.cordova.wechat.Wechat.getBitmap(Wechat.java:482)
W/System.err:     at xu.li.cordova.wechat.Wechat.getThumbnail(Wechat.java:467)
W/System.err:     at xu.li.cordova.wechat.Wechat.buildSharingMessage(Wechat.java:391)
W/System.err:     at xu.li.cordova.wechat.Wechat$1.run(Wechat.java:207)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
W/System.err:     at java.lang.Thread.run(Thread.java:760)
D/Cordova.Plugin.Wechat: File could not be downloaded from http://7xsdma.com1.z0.glb.clouddn.com/space-fxxj1.jpg-100x100.

分享时的配置如下

window.Wechat.share({
    message: {
      title: 'xxx',
      description: 'xxx',
      thumb: 'http://7xsdma.com1.z0.glb.clouddn.com/space-fxxj1.jpg-100x100',
      media: {
        type: window.Wechat.Type.WEBPAGE,
        webpageUrl: 'xxx'
      }
    },
    scene: window.Wechat.Scene.SESSION
})

机型

小米6,Android 7.1.1,API 25

看了下 Manifest 权限也都有(不过进入应用时并没有提示)

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />

手机内应用的权限为

image 试了一下,手动将存储设置为允许是ok的,但是默认并不会允许也没有提示,重新安装也不会

mingdong88 commented 6 years ago

怎样解决的?

kk595076886 commented 5 years ago

怎么解决的 老哥

349989153 commented 5 years ago

@jasonz1987 这个为什么close了

349989153 commented 5 years ago

问题:

1、确实是没有权限导致的。缺了什么权限?缺往手机上写文件的权限(1楼截图里面“读写手机存储”不是绿的)。 2、在config.xml里面加了

<config-file parent="/manifest" target="AndroidManifest.xml" xmlns:android="http://schemas.android.com/apk/res/android">
            <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</config-file>

为什么还是不行?因为安卓6.0的权限变成了运行时权限,不再是安装时候所有权限都拿到,而是随用随取。所以在分享之前,需要用代码取得读写手机存储的权限。

怎么办?

下面2种办法任选其一,我选的第二个。

1、在这个库没更新之前,你可以把这个库clone下来,在Android代码里获取缩略图的地方,加上Android的代码,请求WRITE_EXTERNAL_STORAGE权限,然后在你的cordova项目中引用自己的git库。甚至你改完还可以提个pull request。

2、安装android-permission的插件,然后用这个插件在js代码里,在分享之前请求权限:

if (window.device.platform === 'Android') {
  const permissions = window.cordova.plugins.permissions;
  // 安卓6.0请求读写权限
  permissions.checkPermission(permissions.WRITE_EXTERNAL_STORAGE, (status) => {
    // console.log('安卓权限成功');
    if (status.hasPermission) {
      console.log('有权限');
      window.Wechat.share();
    } else {
      console.log('无权限');
      permissions.requestPermission(permissions.WRITE_EXTERNAL_STORAGE, (requestStatus) => {
        if (requestStatus.hasPermission) {
          window.Wechat.share();
        } else {
          alert('分享需要权限')
        }
      });
    }
  }, () => {
    console.log('安卓权限失败');
  });
} else {
  // ios直接发送分享请求
  window.Wechat.share();
}
349989153 commented 5 years ago

@lainlee @mingdong88 @kk595076886 @jasonz1987

jasonz1987 commented 5 years ago

@349989153 使用插件的版本是多少?

349989153 commented 5 years ago

@jasonz1987 版本:2.6.0

我在这个库里搜了一下requestPermissions(这是请求权限的Android代码),没搜到,我估计这个库还没这个功能呢。

jasonz1987 commented 5 years ago

可以更新到2.8.0 测试一下 最新加入了对权限的判断~

349989153 commented 5 years ago

@jasonz1987 呃,好的,感谢。

能不能告知一下权限的代码在哪个文件里,我去学习一下。

确实没搜到requestPermissions

jasonz1987 commented 5 years ago

使用的是

cordova.requestPermission(this, REQUEST_CODE_ENABLE_PERMISSION, ANDROID_WRITE_EXTERNAL_STORAGE);

Wechat.java 第629行

349989153 commented 5 years ago

@jasonz1987 ok明白了,我觉得可以关闭了。