从活动中调用相机,捕获图像并上传到服务器
Posted
技术标签:
【中文标题】从活动中调用相机,捕获图像并上传到服务器【英文标题】:Calling camera from an activity, capturing an image and uploading to a server 【发布时间】:2012-05-27 14:50:20 【问题描述】:在我的应用程序中,我有一个调用相机的按钮 1,捕获图像后,必须将其保存到设备库中。当我点击button2时,它必须打开画廊,并要求选择一张图片。选中后,它必须显示在这些按钮下方的 imageView 上。
这是我的代码:
package com.android.imageuploading;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
public class ImageUploadingActivity extends Activity
private static final int REQUEST_CODE = 1;
private Bitmap bitmap;
private ImageView imageView;
private Button button_1;
public int TAKE_PICTURE = 1;
private Button button_2;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView = (ImageView) findViewById(R.id.image);
button_1 = (Button) findViewById(R.id.button1);
button_1.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(intent, TAKE_PICTURE);
);
button_2 = (Button) findViewById(R.id.button2);
button_2.setOnClickListener(new View.OnClickListener()
public void onClick(View v)
pickImage(getCurrentFocus());
);
public void pickImage(View view)
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, REQUEST_CODE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == REQUEST_CODE && resultCode == Activity.RESULT_OK)
try
// We need to recyle unused bitmaps
if (bitmap != null)
bitmap.recycle();
InputStream stream = getContentResolver().openInputStream(
data.getData());
bitmap = BitmapFactory.decodeStream(stream);
stream.close();
imageView.setImageBitmap(bitmap);
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
super.onActivityResult(requestCode, resultCode, data);
public static boolean isIntentAvailable(Context context, String action)
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
问题是,当我捕获图像时,它会要求保存或丢弃。当我点击保存时,我的应用程序崩溃了,说:
java.lang.RuntimeException: 将结果 ResultInfowho=null, request=1, result=-1, data=Intent act=inline-data (has extras) 传递到活动 com.android.imageuploading 失败/com.android.imageuploading.ImageUploadingActivity:java.lang.NullPointerException
我需要在哪里更改代码?
【问题讨论】:
Android activity to open camera and upload an image to a server的可能重复 【参考方案1】:在我的情况下,我使用这个:当我点击保存按钮时,图片保存并返回 filePath 变量中的路径。
String filePath =
Environment.getExternalStorageDirectory() +"/your_image_name.jpeg";
File file = new File(filePath);
Uri output = Uri.fromFile(file);
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, output);
在 onactivityresul() 中我使用这个“filePath”。
【讨论】:
无需指定点击保存按钮???...此代码自动将图像保存到图库?? 当然你在按钮点击时调用这个方法 button_1.setOnClickListener(new View.OnClickListener(). 不,我说的是在我们捕获任何图像时可见的保存按钮......我们没有对该按钮的引用......我们吗??? 当我们点击那个保存按钮时。然后我们的 onactivityresult 方法被调用。但是在 onactivityresult 我们只检查文件路径是否不为空然后我们就简单地使用它。【参考方案2】:捕获图像:
public class Camera extends Activity
private static final int CAMERA_REQUEST = 1888;
private String selectedImagePath;
WebView webview;
String fileName = "capturedImage.jpg";
private static Uri mCapturedImageURI;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
Intent cameraIntent = new Intent(ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == RESULT_OK)
if (requestCode == CAMERA_REQUEST)
Bitmap photo = (Bitmap) data.getExtras().get("data");
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
photo.compress(Bitmap.CompressFormat.JPEG, 40, bytes);
Random randomGenerator = new Random();randomGenerator.nextInt();
String newimagename=randomGenerator.toString()+".jpg";
File f = new File(Environment.getExternalStorageDirectory()
+ File.separator + newimagename);
try
f.createNewFile();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
//write the bytes in file
try
fo = new FileOutputStream(f.getAbsoluteFile());
catch (FileNotFoundException e)
// TODO Auto-generated catch block
e.printStackTrace();
try
fo.write(bytes.toByteArray());
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
uri=f.getAbsolutePath();
//this is the url that where you are saved the image
选择图片:
public class ChoosePicture extends Activity
private static final int SELECT_PICTURE = 1;
private String selectedImagePath;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
webview=(WebView)findViewById(R.id.webView1);
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent, SELECT_PICTURE);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == RESULT_OK)
if (requestCode == SELECT_PICTURE)
Uri selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
try
FileInputStream fileis=new FileInputStream(selectedImagePath);
BufferedInputStream bufferedstream=new BufferedInputStream(fileis);
byte[] bMapArray= new byte[bufferedstream.available()];
bufferedstream.read(bMapArray);
Bitmap bMap = BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length);
//this is the image that you are choosen
if (fileis != null)
fileis.close();
if (bufferedstream != null)
bufferedstream.close();
catch (FileNotFoundException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
public String getPath(Uri uri)
String[] projection = MediaStore.Images.Media.DATA ;
Cursor cursor = managedQuery(uri, projection, null, null, null);
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
【讨论】:
以上是关于从活动中调用相机,捕获图像并上传到服务器的主要内容,如果未能解决你的问题,请参考以下文章