好的,这可能是一个很长的帖子,因为我花了最后3天(18小时)。我为iOS创建了一个自定义键盘ext,并负责为Android做同样的事情。我有一切工作就像我想让用户键盘使用,可以在字母和数字/符号之间互换。以及键盘顶部的自定义表情符号类别的回收站视图。在选择其中一个类别(根据选择的类别)时,显示图像的水平回收者视图。在选择其中一个图像时,它应该将图像发送到用户想要的位置。
这适用于Facebook,Twitter,Hipchat,Google驱动器和保留,FB Messagener,但是使用mms和gmail我收到错误,无法附加照片。
我有一个使用带有数据管道的ParcelFileDescriptor的自定义内容提供程序类
public class ***ContentProvider extends ContentProvider {
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException {
ParcelFileDescriptor[] pipe = null;
try {
pipe = ParcelFileDescriptor.createPipe();
AssetManager assests = getContext().getResources().getAssets();
new TransferThread(assests.open(uri.getLastPathSegment()), new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1])).start();
} catch (IOException e) {
e.printStackTrace();
}
return pipe[0];
}
这里有一个帖子说明MMS要查找带有" Images.Media.DATA"列的光标。和" Images.Media.MIME_TYPE"在调用内容提供者的openFile之前。我没有创建SQLite数据库所以我创建了一个matrixCursor并在此处返回...我查看了媒体列here的API并更改了我的光标以匹配(以及要匹配的行的值)没有包括在这篇文章中):
@Override
public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )
{
String[] columns = new String[] {"DATA", "DATE_ADDED", "DATE_MODIFIED", "DISPLAY_NAME", "HEIGHT",
"MIME_TYPE", "SIZE", "TITLE", "WIDTH"};
MatrixCursor matrixCursor = new MatrixCursor(columns);
matrixCursor.addRow(new Object[] {uri.getLastPathSegment(), "image/png"});
// return matrixCursor;
// TODO: Implement this method
return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );
}
除了它导致MMS应用程序强制关闭。
我的分享意图代码在这里:
@Override
public void emojiSelection(String emojiID) {
Uri theUri = Uri.parse("content://com.***.***.***/"+emojiID);
//Sharing intent code
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/png");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//Add data to intent
intent.putExtra(Intent.EXTRA_STREAM, theUri);
Intent intent2 = Intent.createChooser(intent, "Share using...");
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent2);
}
我的清单中有提供者标签,具有读取权限并导出设置为true
MMS应用程序崩溃的堆栈跟踪:
09-14 15:23:31.517 30287-30580/? E/AndroidRuntime: FATAL EXCEPTION: addAttachment
Process: com.android.mms, PID: 30287
java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it.
at android.database.CursorWindow.nativeGetString(Native Method)
at android.database.CursorWindow.getString(CursorWindow.java:451)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
at android.database.CursorWrapper.getString(CursorWrapper.java:137)
at com.android.mms.util.bz.b(FileInfoUtils.java:275)
at com.android.mms.ui.to.a(MessageUtils.java:15213)
at com.android.mms.composer.mt.a(ComposerAttachController.java:128)
at com.android.mms.composer.SimpleEditorBottomPanel.a(SimpleEditorBottomPanel.java:76)
at com.android.mms.composer.dk.a(BottomPanel.java:307)
at com.android.mms.composer.dk.a(BottomPanel.java:296)
at com.android.mms.util.da.run(HandleComposerAttachment.java:3316)
at java.lang.Thread.run(Thread.java:818)
答案 0 :(得分:0)
首先,您的MatrixCursor
格式不正确。你声称支持九列。您的唯一行有两列,表示DATE
是最后一个路径段和DATE_ADDED
。如果MatrixCursor
只支持两列,则只在构造函数中提供这两列,并确保它们具有您想要的列名。
其次,你应该支持the OpenableColumns
。你没有返回大小。
第三,您的列名称错误。尽可能参考SDK中的常量。例如,没有DISPLAY_NAME
列。 是由OpenableColumns.DISPLAY_NAME
标识的列,但实际字符串为_display_name
。
最后,你在创造它之后就抛弃了MatrixCursor
。取消注释返回return
的{{1}}语句,并删除MatrixCursor
语句。
那些应该有助于兼容性。