下面列出了io.reactivex.SingleOnSubscribe#androidx.core.content.FileProvider 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
protected void onNextClicked(File savedPDFFile) {
Intent intentShareFile = new Intent(Intent.ACTION_SEND);
Uri apkURI = FileProvider.getUriForFile(
getApplicationContext(),
getApplicationContext()
.getPackageName() + ".provider", savedPDFFile);
intentShareFile.setDataAndType(apkURI, URLConnection.guessContentTypeFromName(savedPDFFile.getName()));
intentShareFile.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intentShareFile.putExtra(Intent.EXTRA_STREAM,
Uri.parse("file://" + savedPDFFile.getAbsolutePath()));
startActivity(Intent.createChooser(intentShareFile, "Share File"));
}
private void instagramShare(String type, String imagePath) {
final File image = new File(imagePath);
final Uri uri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".social.share.fileprovider",
image);
final Intent share = new Intent(Intent.ACTION_SEND);
share.setType(type);
share.putExtra(Intent.EXTRA_STREAM, uri);
share.setPackage(INSTAGRAM_PACKAGE_NAME);
share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
final Intent chooser = Intent.createChooser(share, "Share to");
final List<ResolveInfo> resInfoList = activity.getPackageManager().queryIntentActivities(chooser,
PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
final String packageName = resolveInfo.activityInfo.packageName;
activity.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
activity.startActivityForResult(chooser, INSTAGRAM_REQUEST_CODE);
}
/**
* 安装apk
*/
public void installApk(File apkFile) {
if (!apkFile.exists()) {
return;
}
Intent intent = new Intent();
//执行动作
intent.setAction(Intent.ACTION_VIEW);
//判读版本是否在7.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
try {
activity.startActivity(intent);
} catch (Exception e) {
Log.d("wwd", "Failed to launcher installing activity");
}
}
public static void launchExternalEditor(
Activity activity, AppAccount appAccount, String experimentId, String relativeFilePath) {
File file =
FileMetadataUtil.getInstance()
.getExperimentFile(appAccount, experimentId, relativeFilePath);
String extension = MimeTypeMap.getFileExtensionFromUrl(file.getAbsolutePath());
String type = MimeTypeMap.getSingleton().getMimeTypeFromExtension(extension);
if (!TextUtils.isEmpty(type)) {
Intent intent = new Intent(Intent.ACTION_EDIT);
Uri photoUri = FileProvider.getUriForFile(activity, activity.getPackageName(), file);
intent.setDataAndType(photoUri, type);
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
try {
activity.startActivity(
Intent.createChooser(
intent, activity.getResources().getString(R.string.photo_editor_dialog_title)));
} catch (ActivityNotFoundException e) {
Log.e(TAG, "No activity found to handle this " + file.getAbsolutePath() + " type " + type);
}
} else {
Log.w(TAG, "Could not find mime type for " + file.getAbsolutePath());
}
}
/**
* 裁剪照片
*
* @param imageUrl
*/
private void CropTheImage(Uri imageUrl) {
Intent cropIntent = new Intent("com.android.camera.action.CROP");
cropIntent.setDataAndType(imageUrl, "image/*");
cropIntent.putExtra("cropWidth", "true");
cropIntent.putExtra("outputX", cropTargetWidth);
cropIntent.putExtra("outputY", cropTargetHeight);
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
File file = new File(mContext.getCacheDir(), "test1.jpg");
copyUrl = Uri.fromFile(file);
Uri contentUri = FileProvider.getUriForFile(this, getPackageName() + ".provider", file);
cropIntent.putExtra("output", contentUri);
} else {
File copyFile = FileHelper.createFileByType(mContext, destType, String.valueOf(System.currentTimeMillis()));
copyUrl = Uri.fromFile(copyFile);
cropIntent.putExtra("output", copyUrl);
}
startActivityForResult(cropIntent, REQUEST_CODE_CROP_PIC);
}
/**
* 安装一个apk
*
* @param context 上下文
* @param authorities Android N 授权
* @param apk 安装包文件
*/
public static void installApk(Context context, String authorities, File apk) {
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_DEFAULT);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(context, authorities, apk);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
uri = Uri.fromFile(apk);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
context.startActivity(intent);
}
/**
* 显示下载完成的通知,点击进行安装
*
* @param context 上下文
* @param icon 图标
* @param title 标题
* @param content 内容
* @param authorities Android N 授权
* @param apk 安装包
*/
public static void showDoneNotification(Context context, int icon, String title, String content,
String authorities, File apk) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
//不知道为什么需要先取消之前的进度通知,才能显示完成的通知。
manager.cancel(requireManagerNotNull().getNotifyId());
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setAction(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addCategory(Intent.CATEGORY_DEFAULT);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(context, authorities, apk);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
uri = Uri.fromFile(apk);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
NotificationCompat.Builder builder = builderNotification(context, icon, title, content)
.setContentIntent(pi);
Notification notification = builder.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
manager.notify(requireManagerNotNull().getNotifyId(), notification);
}
public static boolean exportLogFiles(@NonNull Context context, @NonNull Intent intent) {
try {
File parent = new File(context.getCacheDir(), "logs");
if (!parent.exists() && !parent.mkdir())
return false;
Process process = Runtime.getRuntime().exec("logcat -d");
File file = new File(parent, "logs-" + System.currentTimeMillis() + ".txt");
try (FileOutputStream out = new FileOutputStream(file, false)) {
CommonUtils.copy(process.getInputStream(), out);
} finally {
process.destroy();
}
Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + ".logs", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.putExtra(Intent.EXTRA_STREAM, uri);
return true;
} catch (IllegalArgumentException | IOException ex) {
Log.e(TAG, "Failed exporting logs.", ex);
}
return false;
}
/**
* 获取安装 APP( 支持 8.0) 的意图
* @param file 文件
* @param isNewTask 是否开启新的任务栈
* @return 安装 APP( 支持 8.0) 的意图
*/
public static Intent getInstallAppIntent(final File file, final boolean isNewTask) {
if (file == null) return null;
try {
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
data = Uri.fromFile(file);
} else {
data = FileProvider.getUriForFile(DevUtils.getContext(), DevUtils.getAuthority(), file);
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
intent.setDataAndType(data, "application/vnd.android.package-archive");
return getIntent(intent, isNewTask);
} catch (Exception e) {
LogPrintUtils.eTag(TAG, e, "getInstallAppIntent");
}
return null;
}
public void sendLogs() {
String recipient = SP.getString(R.string.key_maintenance_logs_email, "[email protected]");
int amount = SP.getInt(R.string.key_maintenance_logs_amount, 2);
String logDirectory = LoggerUtils.getLogDirectory();
List<File> logs = this.getLogfiles(logDirectory, amount);
File zipDir = this.ctx.getExternalFilesDir("exports");
File zipFile = new File(zipDir, this.constructName());
LOG.debug("zipFile: {}", zipFile.getAbsolutePath());
File zip = this.zipLogs(zipFile, logs);
Uri attachementUri = FileProvider.getUriForFile(this.ctx, BuildConfig.APPLICATION_ID + ".fileprovider", zip);
Intent emailIntent = this.sendMail(attachementUri, recipient, "Log Export");
LOG.debug("sending emailIntent");
ctx.startActivity(emailIntent);
}
/**
* 安装apk
*/
public void installApk(File apkFile) {
if (!apkFile.exists()) {
return;
}
Intent intent = new Intent();
//执行动作
intent.setAction(Intent.ACTION_VIEW);
//判读版本是否在7.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
Uri apkUri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
}
try {
activity.startActivity(intent);
} catch (Exception e) {
Log.d("wwd", "Failed to launcher installing activity");
}
}
/**
* 创建一个图片地址uri,用于保存拍照后的照片
*
* @param activity
* @return 图片的uri
*/
public static Uri createImagePathUri(Activity activity) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //适配 Android Q
String displayName = String.valueOf(System.currentTimeMillis());
ContentValues values = new ContentValues(2);
values.put(MediaStore.Images.Media.DISPLAY_NAME, displayName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { //SD 卡是否可用,可用则用 SD 卡,否则用内部存储
takePictureUri = activity.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
takePictureUri = activity.getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, values);
}
} else {
String pathName = new StringBuffer().append(FileUtils.getExtPicturesPath()).append(File.separator)
.append(System.currentTimeMillis()).append(".jpg").toString();
takePictureFile = new File(pathName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { //解决Android 7.0 拍照出现FileUriExposedException的问题
String authority = activity.getPackageName() + ".fileProvider";
takePictureUri = FileProvider.getUriForFile(activity, authority, takePictureFile);
} else {
takePictureUri = Uri.fromFile(takePictureFile);
}
}
return takePictureUri;
}
private Uri getOutputUri(String intentType) {
File capturedFile = null;
try {
capturedFile = getCapturedFile(intentType);
} catch (IOException e) {
Log.e("CREATE FILE", "Error occurred while creating the File", e);
e.printStackTrace();
}
// for versions below 6.0 (23) we use the old File creation & permissions model
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
return Uri.fromFile(capturedFile);
}
// for versions 6.0+ (23) we use the FileProvider to avoid runtime permissions
String packageName = getReactApplicationContext().getPackageName();
return FileProvider.getUriForFile(getReactApplicationContext(), packageName + ".fileprovider", capturedFile);
}
/**
* 调用系统文件管理器选择文件
*
* @param file 不能是文件夹
* @param mineType android 可用的minetype
* @param requestCode 请求码
*/
public static void chooseFile(Activity activity, File file, String mineType, int requestCode) {
if (file.isDirectory()) {
ALog.e(TAG, "不能选择文件夹");
return;
}
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(activity.getApplicationContext(),
BuildConfig.APPLICATION_ID + ".provider",
file);
} else {
uri = Uri.fromFile(file);
}
intent.setDataAndType(uri, TextUtils.isEmpty(mineType) ? "*/*" : mineType);
intent.addCategory(Intent.CATEGORY_OPENABLE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivityForResult(intent, requestCode);
}
public PictureBuilder withPicture(final Context context, String pictureFileName) {
final ImageView imageView = v.findViewById(R.id.picture);
imageView.setOnClickListener(arg0 -> {
if (isRequestingPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)) {
return;
}
String fileName = (String) imageView.getTag(R.id.attached_picture);
if (fileName != null) {
Uri target = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID, PicturesUtil.pictureFile(fileName, true));
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(target, "image/jpeg");
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(intent);
}
});
PicturesUtil.showImage(context, imageView, pictureFileName);
return this;
}
/**
* Send Logcat output via email
*/
private void sendLogcat() {
final File cacheDir = getExternalCacheDir();
if (cacheDir == null) {
Log.i(TAG, "Unable to save Logcat. Shared storage is unavailable!");
return;
}
final File file = new File(cacheDir, "idledaddy-logcat.txt");
try {
Utils.saveLogcat(file);
} catch (IOException e) {
e.printStackTrace();
return;
}
final Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("*/*");
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Idle Daddy Logcat");
intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,
getApplicationContext().getPackageName() + ".provider", file));
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
}
public void requestVideoCapture() {
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
String outputPath = String.format("%s/record", Utils.getAppInternalStorageDir(this));
File dir = new File(outputPath);
if (!dir.isDirectory()) {
dir.mkdirs();
}
cameraOutputFilename = String.format("%s/VID_%s.mp4", outputPath, Helper.FILESTAMP_FORMAT.format(new Date()));
Uri outputUri = FileProvider.getUriForFile(this, String.format("%s.fileprovider", getPackageName()), new File(cameraOutputFilename));
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
startActivityForResult(intent, REQUEST_VIDEO_CAPTURE);
return;
}
showError(getString(R.string.cannot_capture_video));
}
public void requestTakePhoto() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (intent.resolveActivity(getPackageManager()) != null) {
String outputPath = String.format("%s/photos", Utils.getAppInternalStorageDir(this));
File dir = new File(outputPath);
if (!dir.isDirectory()) {
dir.mkdirs();
}
cameraOutputFilename = String.format("%s/IMG_%s.jpg", outputPath, Helper.FILESTAMP_FORMAT.format(new Date()));
Uri outputUri = FileProvider.getUriForFile(this, String.format("%s.fileprovider", getPackageName()), new File(cameraOutputFilename));
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
startActivityForResult(intent, REQUEST_TAKE_PHOTO);
return;
}
showError(getString(R.string.cannot_take_photo));
}
public void open() {
if (mFileUri != null && mFileUri.length() > 0) {
Uri uri = Uri.parse(mFileUri);
if (uri.getScheme().equals("file"))
uri = FileProvider.getUriForFile(itemView.getContext(),
"io.mrarm.irc.fileprovider", new File(uri.getPath()));
String mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
MimeTypeMap.getFileExtensionFromUrl(uri.toString()));
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(uri, mimeType);
try {
itemView.getContext().startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(itemView.getContext(), R.string.dcc_error_no_activity,
Toast.LENGTH_SHORT).show();
}
} else {
openMenu();
}
}
/**
* 安装App 使用lib FileProvider
*
* @param apkPath apk 文件对象
*/
public static void installApk(File apkPath, @NonNull String authority) {
Context context = App.sContext;
if (context == null || apkPath == null) {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
// context 使用startActivity需增加 FLAG_ACTIVITY_NEW_TASK TAG 否则低版本上(目前发现在7.0以下版本)会提示以下错误
//android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri;
//判断版本是否在7.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//加入provider
apkUri = FileProvider.getUriForFile(context, authority, apkPath);
//授予一个URI的临时权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
apkUri = Uri.fromFile(apkPath);
}
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
context.startActivity(intent);
}
/**
* 安装App 使用lib FileProvider
* 使用{@link #getCacheDir()} ()}创建文件包
*
* @param apkPath apk 文件对象
*/
public static void installApk(File apkPath, @NonNull String authority) {
Context context = FastManager.getInstance().getApplication().getApplicationContext();
if (context == null || apkPath == null) {
return;
}
Intent intent = new Intent(Intent.ACTION_VIEW);
// context 使用startActivity需增加 FLAG_ACTIVITY_NEW_TASK TAG 否则低版本上(目前发现在7.0以下版本)会提示以下错误
//android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
Uri apkUri;
//判断版本是否在7.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
//加入provider
apkUri = FileProvider.getUriForFile(context, authority, apkPath);
//授予一个URI的临时权限
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
} else {
apkUri = Uri.fromFile(apkPath);
}
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
context.startActivity(intent);
}
@Override
public void onReceive(Context context, Intent intent) {
// Ignore this broadcast if this is the paid version
if(context.getPackageName().equals(BuildConfig.BASE_APPLICATION_ID)) {
Intent sendSettingsIntent = new Intent(ACTION_SEND_SETTINGS);
sendSettingsIntent.setPackage(BuildConfig.PAID_APPLICATION_ID);
BackupUtils.backup(context, new IntentBackupAgent(sendSettingsIntent));
// Get images
for(String filename : U.getImageFilenames()) {
File file = new File(context.getFilesDir() + "/tb_images", filename);
if(file.exists() && U.isPlayStoreRelease(context, BuildConfig.PAID_APPLICATION_ID)) {
Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", file);
context.grantUriPermission(BuildConfig.PAID_APPLICATION_ID, uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
sendSettingsIntent.putExtra(filename, uri);
}
}
// Finally, send the broadcast
context.sendBroadcast(sendSettingsIntent);
}
}
public static Uri getUriFromFile(File file, Context context) {
Uri imageUri = null;
if (file != null && file.exists() && file.isFile()) {
imageUri = FileProvider.getUriForFile(context, "com.lz233.onetext.fileprovider", file);
}
return imageUri;
}
private Uri getUri(Context context, String path, Intent intent) {
File file = new File(path);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
return FileProvider.getUriForFile(context, Setting.fileProviderAuthority, file);
} else {
return Uri.fromFile(file);
}
}
public void play(@Nullable File targetFile) {
if (targetFile != null && targetFile.exists()) {
Intent playIntent = new Intent(Intent.ACTION_VIEW);
Uri videoUri = FileProvider.getUriForFile(context,
context.getPackageName() + ".provider",
targetFile);
playIntent.setDataAndType(videoUri, "video/*");
playIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(playIntent);
}
}
private void facebookShare(String caption, String mediaPath) {
final File media = new File(mediaPath);
final Uri uri = FileProvider.getUriForFile(activity, activity.getPackageName() + ".social.share.fileprovider",
media);
final SharePhoto photo = new SharePhoto.Builder().setImageUrl(uri).setCaption(caption).build();
final SharePhotoContent content = new SharePhotoContent.Builder().addPhoto(photo).build();
final ShareDialog shareDialog = new ShareDialog(activity);
shareDialog.registerCallback(callbackManager, new FacebookCallback<Sharer.Result>() {
@Override
public void onSuccess(Sharer.Result result) {
channel.invokeMethod("onSuccess", null);
Log.d("SocialSharePlugin", "Sharing successfully done.");
}
@Override
public void onCancel() {
channel.invokeMethod("onCancel", null);
Log.d("SocialSharePlugin", "Sharing cancelled.");
}
@Override
public void onError(FacebookException error) {
channel.invokeMethod("onError", error.getMessage());
Log.d("SocialSharePlugin", "Sharing error occurred.");
}
});
if (ShareDialog.canShow(SharePhotoContent.class)) {
shareDialog.show(content);
}
}
private void handleFileClicked(final File clickedFile) {
try {
Uri files = FileProvider.getUriForFile(context, context.getString(R.string.auth), clickedFile);
Intent newIntent = new Intent(Intent.ACTION_VIEW);
newIntent.setDataAndType(files, getMimeType(files));
newIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
context.startActivity(newIntent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, "Can't open file", Toast.LENGTH_LONG).show();
} catch (Exception p) {
p.printStackTrace();
Toast.makeText(context, "Can't open file", Toast.LENGTH_LONG).show();
}
}
private void shareExport() {
File sharingFile = new File(exportDir, appPackageName + ".csv");
Uri uri = FileProvider.getUriForFile(Objects.requireNonNull(getApplicationContext()),
BuildConfig.APPLICATION_ID + ".provider", sharingFile);
Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
shareIntent.setType("application/csv");
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, "Share CSV"));
}
/**
* Save our Launcher image to the cache and return it as a content URI.
*
* IMPORTANT: This could trigger StrictMode. Do not do this in your app.
* For the simplicity of the code sample, this is running on the Main thread
* but these tasks should be done in a background thread.
*
* @throws IOException if image couldn't be saved to the cache.
* @return image content Uri
*/
private Uri saveImageThumbnail() throws IOException {
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
File cachePath = new File(getCacheDir(), IMAGE_CACHE_DIR);
cachePath.mkdirs();
FileOutputStream stream = new FileOutputStream(cachePath + "/" + IMAGE_FILE);
bm.compress(Bitmap.CompressFormat.PNG, 100, stream);
stream.close();
File imagePath = new File(getCacheDir(), IMAGE_CACHE_DIR);
File newFile = new File(imagePath, IMAGE_FILE);
return FileProvider.getUriForFile(this, FILE_PROVIDER_AUTHORITY, newFile);
}
/**
* 安装 Apk
*/
private void installApk(final Context context, final File file) {
XXPermissions.with(MainActivity.this)
// 安装包权限
.permission(Permission.REQUEST_INSTALL_PACKAGES)
.request(new OnPermission() {
@Override
public void hasPermission(List<String> granted, boolean isAll) {
if (isAll) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
uri = FileProvider.getUriForFile(context, context.getPackageName() + ".provider", file);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
} else {
uri = Uri.fromFile(file);
}
intent.setDataAndType(uri, "application/vnd.android.package-archive");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
}
@Override
public void noPermission(List<String> denied, boolean quick) {
}
});
}