在我的应用程序中,我有两个按钮,一个用于从图库加载图像(从设备),另一个用于通过访问设备的相机拍照,我的代码在某些设备上正常工作,在某些设备中,当点击图库中的图像时,应用程序崩溃。任何人都可以帮我找出实际的问题?
public class MainActivity extends ActionBarActivity {
private static int RESULT_LOAD_IMAGE = 1;
private static final int CAMERA_REQUEST = 1888;
private ImageView imageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_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);
}
});
this.imageView = (ImageView)this.findViewById(R.id.imgView);
Button photoButton = (Button) this.findViewById(R.id.button2);
photoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
});
}
xml是
<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="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"></ImageView>
<RelativeLayout
android:id="@+id/relativeLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@android:color/black" >
<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>
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Picture"
android:layout_alignParentRight="true"/>
</RelativeLayout>
答案 0 :(得分:0)
我不确定但是......可能在某些设备上这是&#34; EXTERNAL_CONTENT_URI&#34;不起作用,因为没有外部存储?
答案 1 :(得分:0)
这是Lollypop + 设备中的问题,因此我们必须编写2个逻辑来处理LoolyPop以下&amp;以上Android版本来处理图库。
启动图库图片选择器意图,
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
mContext.startActivityForResult(
Intent.createChooser(intent, "Complete action using"),
DigitalCareContants.IMAGE_PICK);
处理图片
接收图片路径的方法:
private static String getPath(final Context context, final Uri uri) {
final boolean isKitKat = Build.VERSION.SDK_INT >= 19;
if (isKitKat && DocumentsContract.isDocumentUri(uri)) {
if (isExternalStorageDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
if ("primary".equalsIgnoreCase(type)) {
return Environment.getExternalStorageDirectory() + "/"
+ split[1];
}
}
else if (isDownloadsDocument(uri)) {
final String id = DocumentsContract.getDocumentId(uri);
long mId = Long.parseLong(id);
Uri mUri = Uri.parse("content://downloads/public_downloads");
final Uri contentUri = ContentUris.withAppendedId(mUri, mId);
return getDataColumn(context, contentUri, null, null);
}
else if (isMediaDocument(uri)) {
final String docId = DocumentsContract.getDocumentId(uri);
final String[] split = docId.split(":");
final String type = split[0];
Uri contentUri = null;
if ("image".equals(type)) {
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
} else if ("video".equals(type)) {
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
} else if ("audio".equals(type)) {
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
}
final String selection = "_id=?";
final String[] selectionArgs = new String[] { split[1] };
return getDataColumn(context, contentUri, selection,
selectionArgs);
}
}
else if ("content".equalsIgnoreCase(uri.getScheme())) {
return getDataColumn(context, uri, null, null);
}
else if ("file".equalsIgnoreCase(uri.getScheme())) {
return uri.getPath();
}
return null;}
}
收到图库选择器意图处理:
if(requestcode == 1000)
{
String[] filePathColumn = { MediaStore.Images.Media.DATA };
Uri selectedImage = data.getData();
if (Build.VERSION.SDK_INT >= 19) {
InputStream input;
Bitmap bitmap;
String picturePath = getPath(mActivity, selectedImage);
try {
input = mActivity.getContentResolver().openInputStream(
selectedImage);
bitmap = BitmapFactory.decodeStream(input);
Log.d("IMAGE", "Received Image Bitmap : " + bitmap);
Log.d("IMAGE", "Received Image Bitmap Path : " + picturePath);
} catch (FileNotFoundException e1) {
}
} else {
Log.d(TAG, "Android Version is 18 below");
Cursor cursor = mActivity.getContentResolver().query(
selectedImage, filePathColumn, null, null, null);
cursor.moveToFirst();
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String picturePath = cursor.getString(columnIndex);
Log.d("IMAGE", "Received Image Bitmap Path : " + picturePath);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeFile(picturePath, options);
Log.d("IMAGE", "Received Image Bitmap : " + bitmap);
Log.d("IMAGE", "Received Image Bitmap Path : " + picturePath);
cursor.close();
}
}
- 注意:请务必在包中添加以下课程。它已从Lollypop开源代码中复制。
public class DocumentsContract {
private static final String DOCUMENT_URIS =
"com.android.providers.media.documents " +
"com.android.externalstorage.documents " +
"com.android.providers.downloads.documents " +
"com.android.providers.media.documents";
private static final String PATH_DOCUMENT = "document";
private static final String TAG = DocumentsContract.class.getSimpleName();
public static String getDocumentId(Uri documentUri) {
final List<String> paths = documentUri.getPathSegments();
if (paths.size() < 2) {
throw new IllegalArgumentException("Not a document: " + documentUri);
}
if (!PATH_DOCUMENT.equals(paths.get(0))) {
throw new IllegalArgumentException("Not a document: " + documentUri);
}
return paths.get(1);
}
public static boolean isDocumentUri(Uri uri) {
final List<String> paths = uri.getPathSegments();
Log.d(TAG, "paths[" + paths + "]");
if (paths.size() < 2) {
return false;
}
if (!PATH_DOCUMENT.equals(paths.get(0))) {
return false;
}
return DOCUMENT_URIS.contains(uri.getAuthority());
}
}