如何将App生成存储在本地的PDF文件直接发送到指定WhatsApp号码
安卓端向指定WhatsApp号码发送PDF文件解决方案
你当前使用的http://api.whatsapp.com/send链接仅支持传递文本内容,不支持附件参数,所以携带的attachment字段会被WhatsApp直接忽略,无法实现PDF发送,可按照以下方案实现需求:
前置配置:配置FileProvider(安卓7.0及以上必须)
安卓7.0之后禁止直接向第三方应用传递file://类型的Uri,需要通过FileProvider生成授权的content://类型Uri:
- 在
AndroidManifest.xml的<application>标签内添加Provider配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
- 在
res/xml目录下新建file_paths.xml文件,配置PDF文件的存储路径:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 对应App内部files目录,根据你的PDF实际存储路径调整 --> <files-path name="pdfs" path="pdf/" /> <!-- 如果PDF存在外部存储,可添加external-files-path等节点 --> </paths>
核心发送代码
// 1. 处理目标号码:需带国家码,去掉所有特殊符号 String formattedNumber = PhoneNumberUtils.stripSeparators(toNumber); // 2. 生成PDF对应的授权Uri File pdfFile = new File(filepath); Uri pdfUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", pdfFile); // 3. 构造分享Intent Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("application/pdf"); // 指定WhatsApp包名,直接跳转到WhatsApp intent.setPackage("com.whatsapp"); // 指定接收号码,jid格式为 号码@s.whatsapp.net intent.putExtra("jid", formattedNumber + "@s.whatsapp.net"); // 传入PDF文件Uri intent.putExtra(Intent.EXTRA_STREAM, pdfUri); // 给WhatsApp授予文件读取权限 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // 可选:附带发送的文本内容 // intent.putExtra(Intent.EXTRA_TEXT, "这是你要的PDF文件"); // 4. 启动Intent,建议先判断是否安装了WhatsApp,避免崩溃 if (intent.resolveActivity(context.getPackageManager()) != null) { startActivity(intent); } else { // 提示用户未安装WhatsApp }
注意事项
- 目标号码必须是已注册WhatsApp的有效号码,格式为「国家码+手机号」,不能带
+、空格、横杠等符号 - 确保PDF文件已经生成完成、路径正确,FileProvider的路径配置覆盖了PDF的存储目录
- 如果需要发送给WhatsApp Business用户,将Intent的包名改为
com.whatsapp.w4b即可
内容的提问来源于stack exchange,提问作者Pioneer Infoworld
相关产品推荐
相关产品推荐

