我目前有一个Android应用程序,它有一个intent-filter来接收来自Gallery的图像。重要的是按照用户选择的顺序接收图像。这似乎是大多数设备上的默认行为,但是在某些设备上(到目前为止,我已经在摩托罗拉运行的Android 4.x上看到过这种情况)订单似乎未定义。有没有人知道在意图中声明应该按顺序接收图像的方法?或者一旦收到图像以确定所选订单的方式?
以下是清单
中的相关代码 <activity
android:label="@string/app_name"
android:name=".activities.ImportImagesActivity" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND_MULTIPLE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="image/*" />
</intent-filter>
</activity>
来自ImportImagesActivity
private List<Uri> parseIncomingData() {
List<Uri> uriList = null;
Intent intent = this.getIntent();
if(intent != null) {
String action = intent.getAction();
//Single Image
if (action.equalsIgnoreCase("android.intent.action.SEND")) {
//removed for brevity
}
}
//Multiple Images
else if (action.equalsIgnoreCase("android.intent.action.SEND_MULTIPLE")) {
uriList = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
}
}
//more code - at this point images have been recieved
return uriList;
}
修改
为了给出一些上下文,让我解释一下应用程序的一般流程。 用户打开图库并选择图像。他们选择与我的应用“分享”它们。我的应用程序收到一个Uri列表,然后使用由自定义Adapter类支持的内部库显示。图像根据Uri列表正确显示,问题是List&lt; Uri&gt;的顺序。有时不正确。对我的用户来说,重要的是图像按照他们选择的顺序显示。
澄清 当我使用术语库时,我指的是内置的Android应用程序库。 当我使用“共享”一词时,我指的是“图库”应用中的“共享”按钮。这允许用户从诸如Facebook,电子邮件之类的服务列表中进行选择,在这种情况下是我的应用程序。
例如 想象一个带有3个图像的图库,以任意顺序显示:A,B和C.用户选择第一个C然后选择A然后选择B并选择与我的应用程序共享它们。在大多数手机上,我的列表将被正确订购{C,A,B},在违规手机上这个订单似乎是随机的。
我无法使用创建时间戳,因为创建时间通常与选择顺序无关。添加自定义元数据也无济于事,因为我不知道正确的初始订单。
答案 0 :(得分:1)
我的观察是Android图库根据其新近度显示图像。
对于无法确定订单的设备,您可以从库中导入图像并检查其创建时间。这是一个way来做到这一点。或者您可以使用元数据提取器应用程序,可以找到许多罐子。
现在,您可以按照新近度的顺序排列图像,您应该完成。
[编辑] 的
我有一个问题。你说他们可以按任何顺序被选中,所以他们是通过“分享”将它“上传”到服务器上吗?
如果是这样,那么一种方法是检查上传的图像,或者如果你想要选择的顺序,你可以这样做。编辑图像的元数据,必然会有一个无用的标签,选择一个并在触摸时进行编辑。因此,如果我选择图像A它会变为1然后我选择图像B它变为2.但是如果我现在取消选择图像A那么图像B应该变为1.所以,你可以在这里使用节点。这是先进先出(FIFO)方法。在取消选择时,A被抛出列表,B替换它。
这是你想要的吗?
修改的 对不起,我认为如果不创建自己的画廊,你就无法做到这一点。为什么不直接将Android图库导入到应用中的网格视图中?
答案 1 :(得分:1)
是的,我现在才遇到同样的问题。我也在使用Fedor的延迟加载概念。我不确定这将有多大帮助以及这是否是正确的方法。但它仍然为我解决了这个问题。
我不得不在getView()中做一点修改,
@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.gc();
ImageView view;
if(convertView == null) {
view = new ImageView(context);
view.setScaleType(ImageView.ScaleType.FIT_CENTER);
view.setLayoutParams(new GridView.LayoutParams(screenWidth/4, screenHeight/4));
view.setAdjustViewBounds(false);
view.setPadding(2, 2, 2, 2);
System.gc();
}else {
view = (ImageView) convertView;
}
if(view!=null)
{
imageLoader.DisplayImage(urlList.get(position), view);
notifyDataSetChanged(); //Calling this helped to solve the problem.
}
System.gc();
return view;
}