【问题标题】:Android load photos from mobile storage to GridViewAndroid 将照片从移动存储加载到 GridView
【发布时间】:2017-09-16 16:23:53
【问题描述】:

我正在编写这个移动应用程序,在主屏幕上有一个网格视图,应该显示移动设备上的所有照片。还有一个拍照按钮。

我已经编写了 imageAdaptor,现在我的应用程序可以显示我放在 R.drawable 文件夹中的照片。

但是我可以将所有照片存储在设备上吗?包括此应用拍摄的所有照片。

提前致谢。

这是我的代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">

<Button
    android:id="@+id/button"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button"
    android:layout_alignParentBottom="true"
    android:layout_alignParentStart="true"
    android:layout_marginBottom="12dp" />

<GridView
    android:id="@+id/gridview"
    android:layout_width="match_parent"
    android:layout_height="450dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:columnWidth="100dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="10dp"
    android:horizontalSpacing="10dp"
    android:gravity="center"
    />

主要方法:

public class MainActivity extends AppCompatActivity {

public final String APP_TAG = "PhotoApp";
public String photoFileName = "photo.jpg";

private Uri imageUri;


MarshMallowPermission marshMallowPermission = new MarshMallowPermission(this);

@Override

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.grid_view);

    GridView gridview = (GridView) findViewById(R.id.gridview);
    gridview.setAdapter(new ImageAdapter(this));

    };



public Uri getFileUri(String fileName){
    Uri imageUri=null;
    String typestr = "/images/";
    // Get safe storage directory for photos
    File mediaStorageDir = new File(
            Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_PICTURES).getPath(), typestr+fileName);



    // Create the storage directory if it does not exist
    if (!mediaStorageDir.getParentFile().exists() && !mediaStorageDir.getParentFile().mkdirs()) {
        Log.d(APP_TAG, "failed to create directory");
    }

            //creating a URI for the file we just created
            imageUri=Uri.fromFile(mediaStorageDir);


    return imageUri;


}


public void takePhoto(View v ){
    // Check permissions
    if (!marshMallowPermission.checkPermissionForCamera()
            || !marshMallowPermission.checkPermissionForExternalStorage()){
        marshMallowPermission.requestPermissionForCamera();
    }  else {

        // set file name, will pass to getFileUri to convert it into a URI
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
        photoFileName = "IMG_"+timeStamp+".jpg";
        Uri file_uri = getFileUri(photoFileName);

        //just to print it to see if everything alright
        System.out.println(file_uri);

        //a intent specifically to start the android camera
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //a intent used in conjunction with the image/video taking, telling where (in URI formate ) where to store the picture taken
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, file_uri);


        // Start the image capture intent to take photo
        startActivityForResult(takePictureIntent, MY_PERMISSIONS_REQUEST_OPEN_CAMERA);



    }


}

}
*/

适配器:

public class ImageAdapter extends BaseAdapter {

private Context mContext;

public ImageAdapter(Context c) {
    mContext = c;
}

public int getCount() {
    return mThumbIds.length;
}

public Object getItem(int position) {
    return null;
}

public long getItemId(int position) {
    return 0;
}

// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView;

    if (convertView == null) {
        // if it's not recycled, initialize some attributes
        imageView = new ImageView(mContext);
        imageView.setLayoutParams(new GridView.LayoutParams(250, 250));
        imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        imageView.setPadding(8, 8, 8, 8);
    } else {
        imageView = (ImageView) convertView;
    }

    imageView.setImageResource(mThumbIds[position]);
    return imageView;
}

// references to our images
private Integer[] mThumbIds = {
        R.drawable.s1, R.drawable.s2,
        R.drawable.s4, R.drawable.s5,
        R.drawable.s6, R.drawable.s3,

};

}

【问题讨论】:

    标签: android local-storage android-gridview loadimage


    【解决方案1】:

    顺便说一句,这是解决方案,抱歉,我花了很长时间才意识到其他人正在等待答案。对不起。相关代码如下。

    这是 AsyncTask,它将查询设备的 MediaStore 并检索所有照片。请注意,这是检索缩略图而不是全尺寸图像,更具体地说,它是 MICRO_KIND。还有一个 Thumbnail.MINI_KIND。

     /*----------------------------ASYNC TASK TO LOAD THE     PHOTOS-------------
    -------------------------------------------*/
    
    public class LoadPhotos extends AsyncTask<Object, Object, Object> {
    
    @Override
    protected Object doInBackground(Object... params) {
        try {
            final String[] columns = { MediaStore.Images.Media._ID };
            final String orderBy = MediaStore.Images.Media._ID;
    
            Cursor imagecursor = managedQuery(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns,
                    null, null, orderBy);
    
            int image_column_index = imagecursor
                    .getColumnIndex(MediaStore.Images.Media._ID);
    
            AllPhotosActivity.count = imagecursor.getCount();
            AllPhotosActivity.windows = new Bitmap[AllPhotosActivity.count];
    
            for (int i = 0; i < AllPhotosActivity.count; i++) {
                imagecursor.moveToPosition(i);
                // i = index;
                int id = imagecursor.getInt(image_column_index);
                windows[i] = MediaStore.Images.Thumbnails.getThumbnail(
                        getApplicationContext().getContentResolver(), id,
                        MediaStore.Images.Thumbnails.MICRO_KIND, null);
            }
    
            imagecursor.close();
        } catch (Exception e) {
            e.printStackTrace();
            Log.d("AllPhotosActivity",
                    "Error occured while fetching all photos on device.");
        }
        return null;
    
    }
    
    @Override
    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        Handler mHandler = new Handler();
    
        mHandler.post(new Runnable() {
    
            public void run() {
    
                pd.dismiss();
                // imageAdapter.notifyDataSetChanged();
                // sdcardImages.setAdapter(imageAdapter);
    
            }
    
        });
    
        // pd.dismiss();
        imagegrid.setAdapter(imageAdapter);
        // pd.dismiss();
    
    }
    
    @Override
    protected void onProgressUpdate(Object... values) {
        // TODO Auto-generated method stub
        super.onProgressUpdate(values);
    }
    
    }
    

    这是用于将缩略图绑定到网格视图的 GridView 适配器。我的问题只是在我的 ImageAdapter 的 getView 方法中,请注意我正在从我称为 windows 的位图数组的不同索引中设置我的 ImageView 资源。

    public class ImageAdapter extends BaseAdapter {
    private Context mContext;
    
    public ImageAdapter(Context c) {
        mContext = c;
    }
    
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = (ImageView) convertView;
        if (i != null) {
            i.setImageBitmap(windows[position]);
        } else {
            i = new ImageView(mContext.getApplicationContext());
            // i.setPadding(3, 3, 3, 3);
            // i.setScaleType(ImageView.ScaleType.FIT_CENTER);
            i.setAdjustViewBounds(true);
            // i.setMaxHeight(200);
            // i.setMaxWidth(200);
            i.setPadding(3, 3, 3, 3);
            i.setLayoutParams(new GridView.LayoutParams(92, 92));
            i.setImageBitmap(windows[position]);
    
        }
        return i;
    }
    
    public int getCount() {
        // TODO Auto-generated method stub
        return count;
    }
    }
    

    【讨论】:

    • 它似乎不起作用。有些变量和方法是无法解决的,比如AllPhotosActivity、managedQuery、getApplicationContext、windows
    • 您能帮忙解释一下为什么我们需要在这里使用缩略图吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    相关资源
    最近更新 更多