有关如何从Android的资源文件夹发送和共享图像(或文件)的文档和支持。
基本上,我已得到这些链接的支持:
和许多类似的。
但无论如何,我使用的代码是:
内容提供商
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
任何用于图片编辑的应用
消息
松弛
列出项目
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"));
同样的事情!!
答案 0 :(得分:4)
最简单的答案是使用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:exported
更改为false
。
第4步:摆脱EXTRA_TEXT
,因为ACTION_SEND
协议支持 EXTRA_TEXT
或 {{1} },而不是两者。
答案 1 :(得分:0)
您是否尝试在getType()方法中返回与null不同的内容? 某些应用程序可能会检查它,如果不识别,它们将不接受您发送的内容。 (你可以轻松地在那里记录一些内容,至少看看其他应用是否正在调用它)
答案 2 :(得分:0)
主要问题是必须使用#chatArea {
word-wrap: break-word
}
从Uri
解析File
,然后一切正常!