在gridview上显示存储在SD卡上的图像

时间:2014-04-06 09:19:39

标签: android

我的图像存储在SD卡上。

这是路径。

file:///mnt/sdcard/2014-04-06%2010%3A49%3A20.jpg

这些图像路径存储在sqlite db中。我有一个方法将这些路径作为列表返回。

我制作了一个带有gridview的布局文件,用于显示图像的活动。 我还制作了带有图像视图小部件的布局文件。我想创建一个baseadapter来膨胀这个布局文件。 这里列出了主要活动。

<

?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" 
    android:id="@+id/grid_view"  
    android:numColumns="auto_fit"
    android:columnWidth="90dp"
    android:horizontalSpacing="10dp"
    android:verticalSpacing="10dp"
    android:gravity="center"
    android:stretchMode="columnWidth"  
    >

</GridView>

这是baseadapter布局文件的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView
        android:id="@+id/item_image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_marginRight="10dp"/>



</LinearLayout

以下是主要图片活动的代码

public class ImagesActivity extends Activity {
   private ImagesAdapter adapter;
   List<Incidentmages> images= new ArrayList<Incidentmages>();
   DBHelperClass db;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        db= new DBHelperClass(this);        
        setContentView(R.layout.incident_images);
        Intent i=getIntent();
        String myid=i.getStringExtra("IncidentID");
        Log.e("id", myid);
        int _id= Integer.parseInt(myid);
        // get image paths in a list
        images=db.GetIncidentImages(_id);
        adapter= new ImagesAdapter(this,R.layout.images_display,images);

         GridView gridView = (GridView) findViewById(R.id.grid_view);

            // Instance of ImageAdapter Class
            gridView.setAdapter(adapter);

    }
    @Override
        protected void onStop() {
            // TODO Auto-generated method stub
          db.close();
            super.onStop();
        }
    @Override
        protected void onPause() {
            // TODO Auto-generated method stub
         db.close();
            super.onPause();
        }
    @Override
        protected void onDestroy() {
            // TODO Auto-generated method stub
            db.close();
            super.onDestroy();
        }
}

以下是baseadapter的代码

public class ImagesAdapter extends BaseAdapter {

    private Context context1;
    int layoutid;
    List<Incidentmages> images= new ArrayList<Incidentmages>();
    public ImagesAdapter(Context context, int resourcelayouteid,
             List<Incidentmages> images 
            ) {

        this.context1=context;
        this.layoutid=resourcelayouteid;
        this.images=images;

    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return images.size();
    }

    @Override
    public Object getItem(int arg0) {
        // TODO Auto-generated method stub
        return images.get(arg0);
    }

    @Override
    public long getItemId(int arg0) {
        // TODO Auto-generated method stub
        return arg0;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        View row = view;
          RecordHolder holder = null;

          if (row == null) {
              LayoutInflater inflater=
                        LayoutInflater.from(parent.getContext());
                      row =inflater.inflate(layoutid,parent,false);

           holder = new RecordHolder();
           holder.imageItem = (ImageView) row.findViewById(R.id.item_image);
           row.setTag(holder);
          } else {
           holder = (RecordHolder) row.getTag();          }

          Incidentmages d= (Incidentmages)images.get(position);
            String path= d.getPath();
            String mypath= path.substring(5,path.length());
            String FKID= Integer.toString(d.getIncident_id());
            Log.e("Imageadapter", path);    
            Log.e("FK",FKID);
            Bitmap bm= BitmapFactory.decodeFile(mypath);
          holder.imageItem.setImageBitmap(bm);

          return row;

         }

         static class RecordHolder {
         ImageView imageItem;

         }











}

你可以看到我使用BitmapFactory设置图像位图....

我得到的字符串看起来像

///mnt/sdcard/2014-04-06%2010%3A49%3A20.jpg

现在问题是图像不显示。我得到一个空白的屏幕。

我的代码有什么问题吗?

也许问题是我走的路?

以下是我从URI

获取路径字符串的方法
  {
SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            Date mydate = new Date();
            String imagenumber= fm.format(mydate) + ".jpg";
            File file = new File(Environment.getExternalStorageDirectory(),
                    imagenumber);
                    Uri outputFileUri = Uri.fromFile(file);
            Intent picintent= new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            picintent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
            startActivityForResult(picintent,TAKE_PHOTO);   
            myPaths.add(outputFileUri.toString());

        }

2 个答案:

答案 0 :(得分:0)

你需要逃离空间。尝试更换&#34; &#34;用&#34; \&#34;

mypath.replace("%20", "\\ ");

编辑:第二个arg中应该有两个反斜杠。一个人在减价时消耗了。我纠正了它。

试试,这应该可行。

编辑:您的文件路径中有%3A。不确定,请用=替换它们,您的图像路径应该有效。

mypath.replace("%3A","=")

从另一个关于filenames with whitespaces in android

的SO问题中引用

答案 1 :(得分:0)

问题在于我正在拯救路径!...

我已添加代码以在捕获图像时获取文件路径。

@Override
    protected void onActivityResult(int requestCode, int resultCode,
            Intent resultData) {
        super.onActivityResult(requestCode, resultCode, resultData);

            if (resultData != null) {

            String[] projection = { MediaStore.Images.Media.DATA };
                    @SuppressWarnings("deprecation")
                    Cursor cursor = managedQuery(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                            projection, null, null, null);
                    int column_index_data = cursor
                            .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                    cursor.moveToLast();

                    String imagePath = cursor.getString(column_index_data);
                    // add image path
                   myPaths.add(imagePath);
            }