没有WRITE_EXTERNAL_STORAGE分享图片?

时间:2015-03-23 23:55:45

标签: android android-intent

有没有办法使用Intent.ACTION_SEND分享屏幕截图而不需要android.permission.WRITE_EXTERNAL_STORAGE

这是分享部分:

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("image/jpeg");
    shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
    Intent chooserIntent = Intent.createChooser(shareIntent, shareTitle);
    startActivity(chooserIntent);

当uri指向getExternalFilesDir()中的文件时,共享正常,但我更喜欢不需要WRITE_EXTERNAL_STORAGE权限的隐私相关用户的解决方案。

我尝试了3种不同的方法:

  1. 文件提供商:

    uri = FileProvider.getUriForFile(context, authority, imageFile);
    
  2. 这适用于某些共享方式(Gmail),但不适用于其他方式(Google +)。

    1. 上传到网络服务器:

      uri = Uri.parse("http://my-image-host.com/screenshot.jpg");
      
    2. 这在任何地方都失败了,一些人(Google +)崩溃了。

      (我怀疑如果我使用每个社交网络API而不是chooserIntent实现共享逻辑,可以工作

      1. 注入Media Store:

        uri = MediaStore.Images.Media.insertImage(contentResolver, bitmap, name, description);
        
      2. 抛出SecurityException,解释它需要WRITE_EXTERNAL_STORAGE。

        我还缺少其他方法吗?

1 个答案:

答案 0 :(得分:3)

基于work by Stefan Rusek,我创建了LegacyCompatCursorWrapper,旨在帮助提高FileProvider(和其他ContentProvider实施)与正在寻找{{1}的客户端应用的兼容性列而不是找到它们。 _DATA模式最初由_DATA使用,但尝试引用该列的应用从来都不是一个好主意。

要与MediaStore结合使用,请添加my CWAC-Provider library作为依赖项,然后创建自己的FileProvider子类,例如:{/ p>

FileProvider

所有这一切都将/*** Copyright (c) 2015 CommonsWare, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. From _The Busy Coder's Guide to Android Development_ http://commonsware.com/Android */ package com.commonsware.android.cp.v4file; import android.database.Cursor; import android.net.Uri; import android.support.v4.content.FileProvider; import com.commonsware.cwac.provider.LegacyCompatCursorWrapper; public class LegacyCompatFileProvider extends FileProvider { @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return(new LegacyCompatCursorWrapper(super.query(uri, projection, selection, selectionArgs, sortOrder))); } } FileProvider结果打包在query()中。除了您的LegacyCompatCursorWrapper元素的FileProvider属性指向你自己的班级。您可以在this sample app中看到这一点。