Android Image view-Camera
I have been trying to implement this code , where i capture a image from the camera and display it in my image viewer and then can set it as a wallpaper. It is working fine in my emulator but on my phone, when i take the image and click ok-it force closes. any help ?
ImageButton ib;
Button b;
ImageView iv;
Intent i;
final static int cameraData = 0;
Bitmap bmp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.photo);
initialize();
InputStream is = getResources().openRawResource(R.drawable.icon);
bmp = BitmapFactory.decodeStream(is);
}
private void initialize() {
iv = (ImageView) findViewById(R.id.ivReturnedPic);
ib = (ImageButton) findViewById(R.id.ibTakePic);
b = (Button) findViewById(R.id.bSetWall);
b.setOnClickListener(this);
ib.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.bSetWall:
try {
getApplicationContext().setWallpaper(bmp);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case R.id.ibTakePic:
i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i, cameraData);
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
Bundle extras = data.getExtras();
bmp = (Bitmap) extras.get("data");
iv.setImageBitmap(bmp);
}
}
It is driving me crazy!
Here is the error in the logcat i think,
09-04 09:07:49.034: VERBOSE/com.miui.camera.CameraHolder(7499): camera released
09-04 09:07:49.064: WARN/System.err(7463): java.lang.NullPointerException
09-04 09:07:49.064: WARN/System.e开发者_Python百科rr(7463): at com.aradhya.helloandroid.Camera.onActivityResult(Camera.java:72)
09-04 09:07:49.064: WARN/System.err(7463): at android.app.Activity.dispatchActivityResult(Activity.java:3932)
09-04 09:07:49.064: WARN/System.err(7463): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
09-04 09:07:49.064: WARN/System.err(7463): at android.app.ActivityThread.handleSendResult(ActivityThread.java:2582)
09-04 09:07:49.074: WARN/System.err(7463): at android.app.ActivityThread.access$2000(ActivityThread.java:117)
09-04 09:07:49.074: WARN/System.err(7463): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:961)
09-04 09:07:49.074: WARN/System.err(7463): at android.os.Handler.dispatchMessage(Handler.java:99)
09-04 09:07:49.094: WARN/System.err(7463): at android.os.Looper.loop(Looper.java:130)
09-04 09:07:49.094: WARN/System.err(7463): at android.app.ActivityThread.main(ActivityThread.java:3694)
09-04 09:07:49.094: WARN/System.err(7463): at java.lang.reflect.Method.invokeNative(Native Method)
09-04 09:07:49.094: WARN/System.err(7463): at java.lang.reflect.Method.invoke(Method.java:507)
09-04 09:07:49.094: WARN/System.err(7463): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
09-04 09:07:49.104: WARN/System.err(7463): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
09-04 09:07:49.104: WARN/System.err(7463): at dalvik.system.NativeStart.main(Native Method)
09-04 09:07:49.204: VERBOSE/com.miui.camera.Camera(7499): stopPreview
09-04 09:07:49.214: ERROR/com.miui.camera.ui.FocusRectangle(7499): clear
09-04 09:07:49.373: VERBOSE/com.miui.camera.Camera(7499): onStop
09-04 09:07:49.383: VERBOSE/com.miui.camera.Camera(7499): onDestroy
Looks like your rom is MIUI (or you are using the MUI camera)
I'm doing some android development with my HTC Desire on MIUI and it looks like the returned intent data from the camera is different to the usual intent data returned from androids native camera; you need to alter the activity result to accept the data from MIUI camera (I'm currently looking into this i will post my solution if I can work it out)
EDIT: Ok I've managed to sort the issue after investigating the miui camera intent: the returned data from the MIUI camera contains NO EXTRAS, but does contain a path to the image on the sdcard, so I've edited my onActivityResult accordingly to deal with the intent depending on what is in the returned data:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == CAMERA_PIC_REQUEST)
{
if(resultCode == RESULT_OK)
{
if(data.hasExtra("data"))
{
/* if the data has an extra called "data" we assume the returned data
* is from the usual camera app*/
//retrieve the bitmap from the intent
Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
//update the image view with the bitmap
myImageView.setImageBitmap(thumbnail);
}
else if(data.getExtras()==null)
{
/* if there are no extras we assume its the miui camera
* (which returns the path to the image in the returned data)*/
Toast.makeText(getApplicationContext(), "No extras to retrieve!",Toast.LENGTH_SHORT).show();
//retrieve the path from the intent using data.getData().getPath() and create a BitmapDrawable using this path
BitmapDrawable thumbnail = new BitmapDrawable(getResources(), data.getData().getPath());
//update the image view with the newly created drawable
myImageView.setImageDrawable(thumbnail);
}
}
else if (resultCode == RESULT_CANCELED)
{
Toast.makeText(getApplicationContext(), "Cancelled",Toast.LENGTH_SHORT).show();
}
}
}
EDIT2: In my app i also have a picker to choose an existing picture from the sd card using the gallery, and have discovered the same problem for the MIUI gallery, so if you stick a image chooser in your app too this code for the onActivityResult works:
else if (requestCode == GALLERY_REQUEST)
{
if(resultCode == RESULT_OK)
{
if (data != null) {
//our BitmapDrawable for the thumbnail
BitmapDrawable bmpDrawable = null;
//try to retrieve the image using the data from the intent
Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
if(cursor != null)
{
/*if the query worked the cursor will not be null,
* so we assume the normal gallery was used to choose the picture*/
cursor.moveToFirst(); //if not doing this, 01-22 19:17:04.564: ERROR/AndroidRuntime(26264): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
int idx = cursor.getColumnIndex(ImageColumns.DATA);
String fileSrc = cursor.getString(idx);
Bitmap bitmapPreview = BitmapFactory.decodeFile(fileSrc); //load preview image
bmpDrawable = new BitmapDrawable(bitmapPreview);//set the BitmapDrawable to the loaded image
}
else
{
/*if the cursor is null after the query the data returned is different so we assume
* the miui gallery was used (so the data contains the path to the image)*/
bmpDrawable = new BitmapDrawable(getResources(), data.getData().getPath());
}
myImageView.setImageDrawable(bmpDrawable);//update our imageview with the BitmapDrawable
}
else {
Toast.makeText(getApplicationContext(), "Cancelled",Toast.LENGTH_SHORT).show();
}
}
else if (resultCode == RESULT_CANCELED)
{
Toast.makeText(getApplicationContext(), "Cancelled",Toast.LENGTH_SHORT).show();
}
}
I don't know which line (where is 72?) that caused the problem by I guess that you get null data or the intent bundle is null.
First, I would check that request code on the onActivityResult it should be the same as the one you use when you call:
startActivityForResult(i, cameraData);
The second thing I would try is calling the camera intent with an output filename and on the onActivityResult try to load the image from the SD card. Take a look in this example how to do it.
Good Luck
精彩评论