gpt4 book ai didi

android - 不使用 WRITE_EXTERNAL_STORAGE 共享图像?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:54:19 26 4
gpt4 key购买 nike

有没有一种方法可以使用 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);

这适用于某些共享样式 (Gmail),但不适用于其他共享样式 (Google+)。

  1. 上传到网络服务器:

    uri = Uri.parse("http://my-image-host.com/screenshot.jpg");

这到处都失败了,导致一些 (Google+) 崩溃。

(我怀疑如果我自己使用每个社交网络 API 而不是 chooserIntent 实现共享逻辑,这可能有效)

  1. 注入(inject)媒体存储:

    uri = MediaStore.Images.Media.insertImage(contentResolver, bitmap, name, description);

这会抛出一个 SecurityException,说明它需要 WRITE_EXTERNAL_STORAGE。

我还缺少其他方法吗?

最佳答案

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

FileProvider 结合使用, 添加 my CWAC-Provider library作为依赖项,然后创建自己的 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 相同直接(例如 <meta-data> 元素),除了你的 <activity>元素的 android:name属性将指向您自己的类。您可以在 this sample app 中看到实际效果.

关于android - 不使用 WRITE_EXTERNAL_STORAGE 共享图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29222614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com