Android会按顺序从Gallery接收图像

时间:2013-01-07 19:52:11

标签: java android image gallery

我目前有一个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},在违规手机上这个订单似乎是随机的。

我无法使用创建时间戳,因为创建时间通常与选择顺序无关。添加自定义元数据也无济于事,因为我不知道正确的初始订单。

2 个答案:

答案 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;
}