其他分享
首页 > 其他分享> > 从Android资产共享图像时出现问题

从Android资产共享图像时出现问题

作者:互联网

关于如何从Android的assets文件夹发送和共享图像(或文件),有一些文档和支持.

基本上,我得到了以下链接的支持:

> android share images from assets folder
> http://www.nowherenearithaca.com/2012/03/too-easy-using-contentprovider-to-send.html

和很多相似的.

但无论如何,我使用的代码是:

内容提供商

public class AssetsProvider extends ContentProvider {
private static final String LOGTAG = "MD/AssetsProvider";

@Override
public AssetFileDescriptor openAssetFile( Uri uri, String mode ) throws FileNotFoundException
{
    Log.v(LOGTAG, "AssetsGetter: Open asset file");

    AssetManager am = getContext( ).getAssets( );

    String file_name = uri.getPath().substring(1, uri.getPath().length());
    //String file_name = uri.getLastPathSegment();
    // Neither of the two lines above work for me

    if( file_name == null )
        throw new FileNotFoundException( );

    AssetFileDescriptor afd = null;

    try
    {
        afd = am.openFd( file_name );
    }
    catch(IOException e)
    {
        e.printStackTrace( );
    }

    return afd;//super.openAssetFile(uri, mode);
}

@Override
public String getType( Uri p1 )
{
    // TODO: Implement this method
    return null;
}

@Override
public int delete( Uri p1, String p2, String[] p3 )
{
    // TODO: Implement this method
    return 0;
}

@Override
public Cursor query( Uri p1, String[] p2, String p3, String[] p4, String p5 )
{
    // TODO: Implement this method
    return null;
}

@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )
{
    // TODO: Implement this method
    return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );
}

@Override
public Uri insert( Uri p1, ContentValues p2 )
{
    // TODO: Implement this method
    return null;
}

@Override
public boolean onCreate( )
{
    // TODO: Implement this method
    return false;
}

@Override
public int update( Uri p1, ContentValues p2, String p3, String[] p4 )
{
    // TODO: Implement this method
    return 0;
}
}

我不太喜欢它,因为它需要API 16.

ANDROID MANIFEST(在< application>标签内)

<provider
    android:name="package.name.utils.AssetsProvider"
    android:authorities="package.name"
    android:grantUriPermissions="true"
    android:exported="true" />

代码分享图像

Uri theUri = Uri.parse("content://package.name/share_picture.png");
Intent theIntent = new Intent(Intent.ACTION_SEND);
theIntent.setType("image/*");
theIntent.putExtra(Intent.EXTRA_STREAM,theUri);
theIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"");
theIntent.putExtra(android.content.Intent.EXTRA_TEXT, "");
startActivity(theIntent);

我可以成功地看到我的选择器.

我的主要问题是

我可以在一些应用程序中共享我的照片而不是其他应用程序.例如:
我可以分享图片的应用:

> Google环聊
> Twitter
> WhatsApp
> Skype(它坚持“发送”)
> Instagram
> Dropbox

我无法分享图片的应用:

> Gmail收件箱
> Gmail
>任何图像编辑应用程序
>消息
>松弛
> Linkedin
>列表项目
> Hipchat
> Messenger(Facebook)
> Facebook

我无法分享的应用程序有什么问题吗?或者我在代码上做错了什么?也许是setType函数?

先感谢您.

问候.

拉斐尔.

从File共享图像时也会出现此问题,因此与Assets无关的问题是:

今天早上我做了这个测试:

    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    Uri phototUri = Uri.parse(folderToSaveFiles+relativeNameSharePicture);

    shareIntent.setData(phototUri);
    shareIntent.setType("image/png");
    shareIntent.putExtra(Intent.EXTRA_STREAM, phototUri);
    startActivity(Intent.createChooser(shareIntent, "Share Via"));

同样的事情!!

解决方法:

最简单的答案是使用my StreamProvider,它可以为您处理所有这些.如果这不适用于您引用的某些应用程序,则会出现症状问题(例如,来自这些应用程序的堆栈跟踪).但是,我没有将AssetFileDescriptor用于资产(用于兼容设备),而且我的待办事项列表中有更改.

下一个最简单的答案是将资产复制到内部存储和use FileProvider,以及my LegacyCompatCursorWrapper,如this sample app所示.

如果你想坚持你的代码:

步骤#1:实现一个真正的getType()方法,以返回MIME类型.

步骤#2:实现一个真正的query()方法,一个处理OpenableColumns的方法,理想情况下使用我的LegacyCompatCursorWrapper或其他deals with poorly-written clients.

步骤#3:Add FLAG_GRANT_READ_URI_PERMISSION到你的Intent并改变android:export to false.

步骤#4:摆脱EXTRA_TEXT,因为ACTION_SEND协议支持EXTRA_TEXT或EXTRA_STREAM,而不是两者.

标签:android,android-sharing
来源: https://codeday.me/bug/20190623/1273038.html