在我的应用程序中有从相机捕获图像的选项。但是从相机获取图像有问题。当我使用ACTION_IMAGE_CAPTURE
时,它会返回空数据。请帮助我
从相机意图中获取图像路径
错误日志:
07-04 11:22:36.902: E/AndroidRuntime(8329): FATAL EXCEPTION: main
07-04 11:22:36.902: E/AndroidRuntime(8329): java.lang.RuntimeException: Unable to resume activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2124)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2139)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1672)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2836)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.access$1600(ActivityThread.java:117)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:939)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.os.Handler.dispatchMessage(Handler.java:99)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.os.Looper.loop(Looper.java:130)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.main(ActivityThread.java:3687)
07-04 11:22:36.902: E/AndroidRuntime(8329): at java.lang.reflect.Method.invokeNative(Native Method)
07-04 11:22:36.902: E/AndroidRuntime(8329): at java.lang.reflect.Method.invoke(Method.java:507)
07-04 11:22:36.902: E/AndroidRuntime(8329): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
07-04 11:22:36.902: E/AndroidRuntime(8329): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
07-04 11:22:36.902: E/AndroidRuntime(8329): at dalvik.system.NativeStart.main(Native Method)
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=111, result=-1, data=null} to activity {com.pausefablogin/com.pausefablogin.AddPOI}: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.deliverResults(ActivityThread.java:2536)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2111)
07-04 11:22:36.902: E/AndroidRuntime(8329): ... 13 more
07-04 11:22:36.902: E/AndroidRuntime(8329): Caused by: java.lang.NullPointerException
07-04 11:22:36.902: E/AndroidRuntime(8329): at com.pausefablogin.AddPOI.onActivityResult(AddPOI.java:281)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.Activity.dispatchActivityResult(Activity.java:3908)
07-04 11:22:36.902: E/AndroidRuntime(8329): at android.app.ActivityThread.deliverResults(ActivityThread.java:2532)
07-04 11:22:36.902: E/AndroidRuntime(8329): ... 14 more
提前致谢
答案 0 :(得分:9)
尝试这个
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(i , 0);
并调用此
@Override
protected void onActivityResult(int requestCode, int resultCode,
Intent resultData) {
super.onActivityResult(requestCode, resultCode, resultData);
if (resultData != null) {
String[] projection = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, null, null, null);
int column_index_data = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToLast();
String imagePath = cursor.getString(column_index_data);
Bitmap bitmapImage = BitmapFactory.decodeFile(imagePath );
imageView.setImageBitmap(bitmapImage );
}
并使用你想要的prrmission
<uses-permission android:name="android.permission.CAMERA" />
<permission android:name="android.permission.FLASHLIGHT" />
<uses-feature android:name="android.hardware.camera"/>
答案 1 :(得分:5)
我遇到了同样的问题,以下内容对我有用:
@Override
public void onClick(View v) {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
//super.onActivityResult(requestCode, resultCode, data);
if(requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
final ContentResolver cr = getContentResolver();
final String[] p1 = new String[] {
MediaStore.Images.ImageColumns._ID,
MediaStore.Images.ImageColumns.DATE_TAKEN
};
Cursor c1 = cr.query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, p1, null, null, p1[1] + " DESC");
if ( c1.moveToFirst() ) {
String uristringpic = "content://media/external/images/media/" +c1.getInt(0);
Uri uri = Uri.parse(uristringpic);
try {
Bitmap bm = android.provider.MediaStore.Images.Media.getBitmap(cr, uri);
希望这有帮助,因为我知道它是多么令人沮丧。
答案 2 :(得分:3)
如果您成功实施了代码,您将获得手动捕获的图像,您可以将其保存以备将来使用。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
videoView.setVisibility(View.INVISIBLE);
imageView.setVisibility(View.VISIBLE);
imageView.setImageBitmap(photo);
}
}
答案 3 :(得分:3)
您可以使用以下步骤:
// create a global variable
File destination;
openCameraBtn.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v) {
destination = new File(Environment.getExternalStorageDirectory(),"image.jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination));
startActivityForResult(intent, CAMERA_PICTURE);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
if(requestCode == CAMERA_PICTURE && resultCode == Activity.RESULT_OK)
{
try{
FileInputStream in = new FileInputStream(destination);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 10; //Downsample 10x
Log.d("PP", " bitmap factory=========="+options);
Bitmap user_picture_bmp = BitmapFactory.decodeStream(in, null, options);
userImage.setImageBitmap(user_picture_bmp);
} catch (Exception e)
{ e.printStackTrace();
}
}
请在清单文件中声明权限和功能。
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
如果您想要更详细,那么您可以使用以下链接:
http://developer.android.com/guide/topics/media/camera.html
我希望你能成功。
答案 4 :(得分:2)
您可能正在运行三星设备。我相信这是这些设备中发生的错误。否则你必须得到URI。这样做:
/**
* (This is a variable instance) Contains the path and file name where you want to save the image.
* Mainly used to start Intent.Action_View with this URI. (GalleryApp)
*/
private Uri uriImage= null;
public void onClickCamera(View v){
// Cria uma intent para capturar uma imagem e retorna o controle para quem o chamou (NAO PRECISA DECLARAR PERMISSAO NO MANIFESTO PARA ACESSAR A CAMERA POIS O FAZEMOS VIA INTENT).
// Creates an intent to capture an image and returns control to the caller
Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
// Cria um arquivo para salvar a imagem.
// Creates an file to save the image.
uriImage = ProcessaImagens.getOutputMediaFileUri( ProcessaImagens.MEDIA_TYPE_IMAGE, getActivity().getApplicationContext() );
// Intent to pass a URI object containing the path and file name where you want to save the image. We'll get through the data parameter of the method onActivityResult().
intent.putExtra( MediaStore.EXTRA_OUTPUT, uriImagem );
// Starts the intent to image capture and waits the result.
startActivityForResult( intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
}
ProcessaImagens课程是我编写的课程,我与所有人分享。可以使用这个类来方便。如果要在数据库中保存图像,它有一种非常好的压缩图像的方法。在其onActivityResult()
方法中执行此操作:
@Override
public void onActivityResult( int requestCode, int resultCode, Intent data ) {
// If finished activity on startForActivityResult.
if ( resultCode == Activity.RESULT_OK ) {
if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
String imagePath = uriImage.getPath();
// I will compress the imagem. Read the javadoc from method and you'll see which it returns both bitmap and array bytes.
List<Object> imageCompact = ProcessaImagens.compactarImagem( uriImagem.getPath() );
Bitmap imageBitmap = (Bitmap) imageCompact.get( 0 );
byte[] imageBytes = (byte[]) imageCompact.get( 1 );
}
}
// If canceled activity on startForActivityResult.
else if ( resultCode == Activity.RESULT_CANCELED ) {
if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
// User canceled the image capture.
Log.d( getTag(), "Image capture canceled!" );
}
}
// If an error occurred in the activity on startForActivityResult.
else {
// Failed the image capture, alert the user.
Toast.makeText( getActivity().getApplicationContext(), "FAILED! The image capture failed!", Toast.LENGTH_LONG ).show();
Log.e( getTag(), "FAILED! The image capture failed!" );
}
}
请注意,我使用了getActivity().getApplicationContext()
,因为我从片段而不是从Activity获取上下文。我相信通过这种方法,你可以得到你想要的东西。只需稍微改变形式来获取上下文。
答案 5 :(得分:1)
Cursor cursor = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, new String[]{Media.DATA, Media.DATE_ADDED, MediaStore.Images.ImageColumns.ORIENTATION}, Media.DATE_ADDED, null, "date_added ASC");
if(cursor != null && cursor.moveToFirst())
{
do {
Uri uri = Uri.parse(cursor.getString(cursor.getColumnIndex(Media.DATA)));
String photoPath = uri.toString();
}while(cursor.moveToNext());
cursor.close();
}
当while循环执行最后一次操作时,它会给出上次捕获的图像路径。
答案 6 :(得分:-1)
确保已将此标记放入清单文件中:<uses-feature android:name="android.hardware.camera" />
这可能会对您有所帮助:https://stackoverflow.com/a/10779050/2514032