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

时间:2015-07-30 17:16:07

标签: android android-sharing

有关如何从Android的资源文件夹发送和共享图像(或文件)的文档和支持。

基本上,我已得到这些链接的支持:

  1. this method
  2. android share images from assets folder
  3. 和许多类似的。

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

    内容提供商

    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环聊

    • 微博

    • WhatsApp的

    • Skype(它停留在&#34;发送&#34;)

    • Instagram的

    • 收存箱

    我无法分享照片的应用

    • Gmail收件箱

    • 的Gmail

    • 任何用于图片编辑的应用

    • 消息

    • 松弛

    • LinkedIn

    • 列出项目

    • Hipchat

    • Messenger(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"));
    

    同样的事情!!

3 个答案:

答案 0 :(得分:4)

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

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

如果您希望坚持使用代码:

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

步骤2:实施一个真正的query()方法,一个处理OpenableColumns的方法,理想情况下使用我的LegacyCompatCursorWrapperdeals with poorly-written clients

步骤3:Add FLAG_GRANT_READ_URI_PERMISSION发送到Intent并将android:exported更改为false

第4步:摆脱EXTRA_TEXT,因为ACTION_SEND协议支持 EXTRA_TEXT {{1} },而不是两者。

答案 1 :(得分:0)

您是否尝试在getType()方法中返回与null不同的内容? 某些应用程序可能会检查它,如果不识别,它们将不接受您发送的内容。 (你可以轻松地在那里记录一些内容,至少看看其他应用是否正在调用它)

答案 2 :(得分:0)

主要问题是必须使用#chatArea { word-wrap: break-word } Uri解析File,然后一切正常!