2011-01-11 13 views
0

Dieser Cursor gibt null zurück, wenn ich versuche, es auf dem Gerät auszuführen. Es funktioniert gut auf Emulator.managedQuery (Media.EXTERNAL_CONTENT_URI, Projektion, null, null, null); Gibt null zurück, wenn auf dem Gerät ausgeführt wird

Kann jemand bitte darauf hinweisen, wenn ich etwas vermisse oder falsch mache.

+2

Zunächst einmal sollte die Konstante MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI Zweitens, ich nehme an, dass Sie Ihr Gerät mit dem Gerät in USB-Massenspeichermodus debuggen .. Ihr Computer auf die SD-Karte Zugriff Bedeutung . Ich würde empfehlen, das Gerät nur in den Modus zu versetzen und das Debuggen so zu versuchen. Dadurch kann die SD-Karte vom Telefon gelesen werden. Wenn Sie nicht laden nur Modus versuchen Sie etwas anderes als USB-Massenspeicher. –

Antwort

1

gleiche für diesen Code arbeiten

public class LoadImagesFromSDCardActivity extends Activity implements 
OnItemClickListener { 

/** 
* Grid view holding the images. 
**/ 

private GridView sdcardImages; 
/** 
* Image adapter for the grid view. 
**/ 
private ImageAdapter imageAdapter; 
/** 
* Display used for getting the width of the screen. 
**/ 
private Display display; 
ImageView imgView; 

/** 
* Creates the content view, sets up the grid, the adapter, and the click listener. 
* 
* @see android.app.Activity#onCreate(android.os.Bundle) 
**/ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    // Request progress bar 
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
    setContentView(R.layout.main); 

    display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
    imgView=(ImageView)findViewById(R.id.imgView); 
    setupViews(); 
    setProgressBarIndeterminateVisibility(true); 
    loadImages(); 
} 

/** 
* Free up bitmap related resources. 
**/ 
protected void onDestroy() { 
    super.onDestroy(); 
    final GridView grid = sdcardImages; 
    final int count = grid.getChildCount(); 
    ImageView v = null; 
    for (int i = 0; i < count; i++) { 
     v = (ImageView) grid.getChildAt(i); 
     ((BitmapDrawable) v.getDrawable()).setCallback(null); 
    } 
} 
/** 
* Setup the grid view. 
**/ 
private void setupViews() { 
    sdcardImages = (GridView) findViewById(R.id.sdcard); 
    sdcardImages.setNumColumns(display.getWidth()/95); 
    sdcardImages.setClipToPadding(false); 
    sdcardImages.setOnItemClickListener(LoadImagesFromSDCardActivity.this); 
    imageAdapter = new ImageAdapter(getApplicationContext()); 
    sdcardImages.setAdapter(imageAdapter); 
} 
/** 
* Load images. 
*/ 
private void loadImages() { 
    final Object data = getLastNonConfigurationInstance(); 
    if (data == null) { 
     new LoadImagesFromSDCard().execute(); 
    } else { 
     final LoadedImage[] photos = (LoadedImage[]) data; 
     if (photos.length == 0) { 
      new LoadImagesFromSDCard().execute(); 
     } 
     for (LoadedImage photo : photos) { 
      addImage(photo); 
     } 
    } 
} 
/** 
* Add image(s) to the grid view adapter. 
* 
* @param value Array of LoadedImages references 
*/ 
private void addImage(LoadedImage... value) { 
    for (LoadedImage image : value) { 
     imageAdapter.addPhoto(image); 
     imageAdapter.notifyDataSetChanged(); 
    } 
} 

/** 
* Save bitmap images into a list and return that list. 
* 
* @see android.app.Activity#onRetainNonConfigurationInstance() 
*/ 
@Override 
public Object onRetainNonConfigurationInstance() { 
    final GridView grid = sdcardImages; 
    final int count = grid.getChildCount(); 
    final LoadedImage[] list = new LoadedImage[count]; 

    for (int i = 0; i < count; i++) { 
     final ImageView v = (ImageView) grid.getChildAt(i); 
     list[i] = new LoadedImage(((BitmapDrawable) v.getDrawable()).getBitmap()); 
    } 

    return list; 
} 
/** 
* Async task for loading the images from the SD card. 
* 
* @author Mihai Fonoage 
* 
*/ 
class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> { 

    /** 
    * Load images from SD Card in the background, and display each image on the screen. 
    * 
    * @see android.os.AsyncTask#doInBackground(Params[]) 
    */ 
    @Override 
    protected Object doInBackground(Object... params) { 
     //setProgressBarIndeterminateVisibility(true); 
     Bitmap bitmap = null; 
     Bitmap newBitmap = null; 
     Uri uri = null;    

     // Set up an array of the Thumbnail Image ID column we want 
     String[] projection = {MediaStore.Images.Thumbnails._ID}; 
     // Create the cursor pointing to the SDCard 
     Cursor cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, 
       projection, // Which columns to return 
       null,  // Return all rows 
       null,  
       null); 
     int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID); 
     int size = cursor.getCount(); 
     // If size is 0, there are no images on the SD Card. 
     if (size == 0) { 
      //No Images available, post some message to the user 
     } 
     int imageID = 0; 
     for (int i = 0; i < size; i++) { 
      cursor.moveToPosition(i); 
      imageID = cursor.getInt(columnIndex); 
      uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID); 
      try { 
       bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); 
       if (bitmap != null) { 
        newBitmap = Bitmap.createScaledBitmap(bitmap, 70, 70, true); 
        bitmap.recycle(); 
        if (newBitmap != null) { 
         publishProgress(new LoadedImage(newBitmap)); 
        } 
       } 
      } catch (IOException e) { 
       //Error fetching image, try to recover 
      } 
     } 
     cursor.close(); 
     return null; 
    } 
    /** 
    * Add a new LoadedImage in the images grid. 
    * 
    * @param value The image. 
    */ 
    @Override 
    public void onProgressUpdate(LoadedImage... value) { 
     addImage(value); 
    } 
    /** 
    * Set the visibility of the progress bar to false. 
    * 
    * @see android.os.AsyncTask#onPostExecute(java.lang.Object) 
    */ 
    @Override 
    protected void onPostExecute(Object result) { 
     setProgressBarIndeterminateVisibility(false); 
    } 
} 

/** 
* Adapter for our image files. 
* 
* @author Mihai Fonoage 
* 
*/ 
class ImageAdapter extends BaseAdapter { 

    private Context mContext; 
    private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>(); 

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

    public void addPhoto(LoadedImage photo) { 
     photos.add(photo); 
    } 

    public int getCount() { 
     return photos.size(); 
    } 

    public Object getItem(int position) { 
     return photos.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     final ImageView imageView; 
     if (convertView == null) { 
      imageView = new ImageView(mContext); 
     } else { 
      imageView = (ImageView) convertView; 
     } 
     imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     imageView.setPadding(8, 8, 8, 8); 
     imageView.setImageBitmap(photos.get(position).getBitmap()); 
     return imageView; 
    } 
} 

/** 
* A LoadedImage contains the Bitmap loaded for the image. 
*/ 
private static class LoadedImage { 
    Bitmap mBitmap; 

    LoadedImage(Bitmap bitmap) { 
     mBitmap = bitmap; 
    } 

    public Bitmap getBitmap() { 
     return mBitmap; 
    } 
} 
/** 
* When an image is clicked, load that image as a puzzle. 
*/ 
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {   
    int columnIndex = 0; 
    String[] projection = {MediaStore.Images.Media.DATA}; 
    Cursor cursor = managedQuery(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, 
      projection, 
      null, 
      null, 
      null); 
    if (cursor != null) { 
     columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToPosition(position); 
     String imagePath = cursor.getString(columnIndex); 

     FileInputStream is = null; 
     BufferedInputStream bis = null; 
     try { 
      is = new FileInputStream(new File(imagePath)); 
      bis = new BufferedInputStream(is); 
      Bitmap bitmap = BitmapFactory.decodeStream(bis); 
      Bitmap useThisBitmap = Bitmap.createScaledBitmap(bitmap, 200, 200, true); 
      Log.i("called","called"); 
      imgView.setImageBitmap(useThisBitmap); 
      bitmap.recycle(); 
      //Display bitmap (useThisBitmap) 
     } 
     catch (Exception e) { 
      //Try to recover 
     } 
     finally { 
      try { 
       if (bis != null) { 
        bis.close(); 
       } 
       if (is != null) { 
        is.close(); 
       } 
       cursor.close(); 
       projection = null; 
      } catch (Exception e) { 
      } 
     } 
    } 
    } 

} 

Und

main.xml

<GridView 
    android:id="@+id/sdcard" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="10dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" /> 
    <ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imgView" 
    ></ImageView> 
</LinearLayout> 

+0

Ich bin verwirrt, ist das eine Lösung oder eine andere Frage? –

+0

nur eine einfache Beobachtung: Verwenden Sie 'imageCursor.moveToFirst()', die false zurückgibt, wenn der Cursor leer ist anstelle von 'cursor.getCount()', weil es schneller ist. Hier ist es: 'if (! Cursor.moveToFirst()) { // Keine Bilder verfügbar, posten Sie eine Nachricht an den Benutzer }' – Paul