问题描述
- 如何读取手机中相册的图像文件
-
对于以下的代码片段出现一个问题。实际上我是想读取手机中相册的图片。文件名为image2.jpg ,image3.jpg 的图片。但是报出了错误。
代码是:public static Uri getRandomImage(ContentResolver resolver) { String secondo = "image2.jpg"; String terzo = "image3.jpg"; String quarto = "image4.jpg"; String quinto = "image5.jpg"; String sesto = "image6.jpg"; String settimo = "image7.jpg"; String ottavo = "image8.jpg"; String[] projection = new String[] { BaseColumns._ID, MediaColumns.DATA, }; Uri uri = Media.EXTERNAL_CONTENT_URI; Cursor cursor = Media.query(resolver, uri, projection, null, MediaColumns._ID); if (cursor == null || cursor.getCount() <= 0) { return null; } cursor.moveToPosition(new Random().nextInt(cursor.getCount())); String completefilepath = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA)); if(completefilepath == secondo || completefilepath == terzo || completefilepath == quarto || completefilepath == quinto || completefilepath == sesto || completefilepath == settimo || completefilepath == ottavo){ string = cursor.getString(1); } return Uri.withAppendedPath(uri, string); }
LOGCAT:
E/AndroidRuntime(9147): FATAL EXCEPTION: main E/AndroidRuntime(9147): java.lang.IllegalStateException: Unknown URL: content://media/external/images/media/null E/AndroidRuntime(9147): at android.os.Parcel.readException(Parcel.java:1268) E/AndroidRuntime(9147): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160) E/AndroidRuntime(9147): at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:125) E/AndroidRuntime(9147): at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:538) E/AndroidRuntime(9147): at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:467) E/AndroidRuntime(9147): at android.content.ContentResolver.openFileDescriptor(ContentResolver.java:380) E/AndroidRuntime(9147): at it.bisemanuDEV.slidepuzzle.TileView.getImageFromUri(TileView.java:559) E/AndroidRuntime(9147): at it.bisemanuDEV.slidepuzzle.TileView.newGame(TileView.java:156) E/AndroidRuntime(9147): at it.bisemanuDEV.slidepuzzle.SlidePuzzleActivity.onOptionsItemSelected(SlidePuzzleActivity.java:377) E/AndroidRuntime(9147): at android.app.Activity.onMenuItemSelected(Activity.java:2762) E/AndroidRuntime(9147): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730) E/AndroidRuntime(9147): at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143) E/AndroidRuntime(9147): at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855) E/AndroidRuntime(9147): at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532) E/AndroidRuntime(9147): at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122) E/AndroidRuntime(9147): at android.view.View$PerformClick.run(View.java:8819) E/AndroidRuntime(9147): at android.os.Handler.handleCallback(Handler.java:603) E/AndroidRuntime(9147): at android.os.Handler.dispatchMessage(Handler.java:92) E/AndroidRuntime(9147): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime(9147): at android.app.ActivityThread.main(ActivityThread.java:4627) E/AndroidRuntime(9147): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(9147): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime(9147): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) E/AndroidRuntime(9147): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) E/AndroidRuntime(9147): at dalvik.system.NativeStart.main(Native Method)
解决方案
你可以参考这个方法,然后再自己变通一下
XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView
android:id="@+id/imgView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"></ImageView>
<Button
android:id="@+id/buttonLoadPicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="0"
android:text="Load Picture"
android:layout_gravity="center"></Button>
</LinearLayout>
class文件:
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class ImageGalleryDemoActivity extends Activity {
private static int RESULT_LOAD_IMAGE = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture);
buttonLoadImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent i = new Intent(
Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(i, RESULT_LOAD_IMAGE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
Uri selectedImage = data.getData();
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Cursor cursor = getContentResolver().query(selectedImage,
filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
cursor.close();
ImageView imageView = (ImageView) findViewById(R.id.imgView);
imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
}
}
}
解决方案二:
这个错好像是因为你的手机的保存图片的数据库中没有上述匹配的图片,所以string为空的,故当拼接的时候会出现null
解决方案三:
Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
photoPickerIntent.setType("image/*");
startActivityForResult(photoPickerIntent, int requestCode);
时间: 2024-09-15 06:10:30