<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_provider_paths" />
</provider>
file_provider_paths.xml
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!--内置SD卡 Environment.getExternalStorageDirectory() .表示共享所有的目录,也可以指定共享的目录-->
<external-path
name="external-path"
path="."/>
<!--内置SD卡 Context.getExternalCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
<external-cache-path
name="external-cache-path"
path="."/>
<!--内置SD卡 Context.getExternalFilesDir(null) .表示共享所有的目录,也可以指定共享的目录-->
<external-files-path
name="external-files-path"
path="."/>
<!--data目录下 Context.getFilesDir() .表示共享所有的目录,也可以指定共享的目录-->
<files-path
name="files_path"
path="."/>
<!--data缓存目录 Context.getCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
<cache-path
name="cache-path"
path="."/>
<!--这个标签Android官方文档中是没有提及,Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录-->
<root-path
name="name"
path="."/>
</paths>
package com.tencent;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;
import androidx.core.content.FileProvider;
import com.tencent.mm.opensdk.modelmsg.SendMessageToWX;
import com.tencent.mm.opensdk.modelmsg.WXFileObject;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;
import com.tencent.qcloud.tim.uikit.TUIKit;
import com.xin.libandroidpaysocial.share.Constant;
import com.xin.libandroidpaysocial.share.ShareData;
import com.xin.libandroidpaysocial.share.ShareUtils;
import java.io.File;
/**
* https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Share_and_Favorites/Android.html
* https://developers.weixin.qq.com/community/develop/doc/0004886026c1a8402d2a040ee5b401
*
* 注意了: 在androidmainfest.xml app节点下添加 android:requestLegacyExternalStorage="true"
否则分享的文件大小会是0
*/
public class ShareFile {
/**
* context 是application 无法获得所属页面的activity
*
* @param context
* @param f
*/
public static void openFile(Context context, File f) {
// boolean b1 = opFileByContent(context, f);
// log("openFile() called with: opFileBy = [" + b1 + "]");
boolean b = doShare(context, f);
if (!b) {
openFileByApp(context, f);
}
}
private static boolean opFileByContent(Context context, File f) {
try {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(f).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
f = f.getParentFile();
//7.0以上需要
if (Build.VERSION.SDK_INT >= 24) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".uikit.fileprovider", f);
intent.setDataAndType(uri, mimetype);
} else {
intent.setDataAndType(Uri.fromFile(f), mimetype);
}
intent.addCategory(Intent.CATEGORY_OPENABLE);
context.startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* 先尝试用系统的方式打开,系统的方式未找到,调用微信分享
*
* @param context
* @param f
*/
private static boolean openFileByApp(Context context, File f) {
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
String extension = android.webkit.MimeTypeMap.getFileExtensionFromUrl(Uri.fromFile(f).toString());
String mimetype = android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
//7.0以上需要
if (Build.VERSION.SDK_INT >= 24) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".uikit.fileprovider", f);
intent.setDataAndType(uri, mimetype);
} else {
intent.setDataAndType(Uri.fromFile(f), mimetype);
}
context.startActivity(intent);
return true;
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(context, "打开文件出错,无支持的应用", Toast.LENGTH_LONG).show();
return false;
}
}
private static boolean doShare(Context context, File f) {
if (!(context instanceof Activity)) {
/*不是activity*/
return false;
}
if (!f.exists()) {
log("文件不存在");
Toast.makeText(context, "文件不存在", Toast.LENGTH_LONG).show();
return false;
}
final IWXAPI api = WXAPIFactory.createWXAPI(context, Constant.WX_AppID);
api.registerApp(Constant.WX_AppID);
if (!api.isWXAppInstalled()) {
/*未安装微信*/
return false;
}
if(f.length()>10*1024*1024){
Toast.makeText(context, "文件超过10M", Toast.LENGTH_LONG).show();
return false;
}
log("doShare() called with: f = [" + f.getAbsolutePath() + "]");
// f = new File(context.getFilesDir(), "6221bdc_v4.msgstore-shm");
String filePath = null;
if (checkVersionValid(context) && checkAndroidNotBelowN()) {
// 要与`AndroidManifest.xml`里配置的`authorities`一致,假设你的应用包名为com.example.app
Uri contentUri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", f);
// 授权给微信访问路径 // 这里填微信包名
context.grantUriPermission("com.tencent.mm", contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
filePath = contentUri.toString();
} else {
filePath = f.getAbsolutePath();
}
try {
Activity activity = (Activity) context;
ShareData shareData = new ShareData();
WXFileObject wxMiniProgramObject = new WXFileObject();
wxMiniProgramObject.setFilePath(filePath);
shareData.setWxMiniProgramObject(wxMiniProgramObject);
shareData.setShare_title(f.getName());
shareData.setShare_desc(f.getName());
ShareUtils.wx(activity, shareData, SendMessageToWX.Req.WXSceneSession,
new ShareUtils.ShareCallBack() {
@Override
public void onComplete() {
log("onComplete() called");
}
@Override
public void onError() {
log("onError() called");
}
@Override
public void onCancel() {
log("onCancel() called");
}
});
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
private static void log(String s) {
Log.d("ShareFile", s);
}
// 判断微信版本是否为7.0.13及以上
private static boolean checkVersionValid(Context context) {
IWXAPI api = WXAPIFactory.createWXAPI(context, Constant.WX_AppID);
return api.getWXAppSupportAPI() >= 0x27000D00;
}
// 判断Android版本是否7.0及以上
private static boolean checkAndroidNotBelowN() {
return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N;
}
}
网友评论