从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