2017-09-16 1 views
0

이 모바일 앱을 쓰고 있습니다. 기본 화면에 모바일 장치의 모든 사진을 표시해야하는 격자보기가 있습니다. 그리고 사진을 찍는 버튼.안드로이드는 모바일 저장 장치에서 GridView로 사진을로드합니다.

이미 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, 

}; 

}

답변

0

해결책은 다음과 같습니다. btw, 죄송합니다. 나는 다른 사람들이 답을 기다리고 있다는 것을 알지 못했을 정도로 오래 걸렸습니다. 죄송합니다. 관련 코드는 다음과 같습니다.

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에 바인딩 할 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; 
} 
} 
+0

작동하지 않는 것 같습니다. AllPhotosActivity, managedQuery, getApplicationContext, windows와 같은 일부 변수와 메소드를 해결할 수 없습니다. –

+0

여기서 축소판을 사용해야하는 이유를 설명해 주시겠습니까? –

관련 문제