1

以下是在我的应用程序中使用相机拍照的代码。在按imgButton时,应该拍摄照片并显示在imageView中。在Android中使用相机应用程序时出错

会发生什么情况是,当我按下按钮时,照相机被打开。但是拍摄的图像没有在image view

显示在调试看来if (imgFile.exists())的方法onActivityResult()是走出虚假和不被执行的内部if的语句。

MainActivity.java

package com.example.nirvan.cameraexample3; 

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.media.Image; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 

import java.io.File; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class MainActivity extends AppCompatActivity 
{ 

private String pictureImagePath = ""; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button imgButton=(Button) findViewById(R.id.imgButton); 


    View.OnClickListener imgButtonClickListener=new View.OnClickListener() 
    { 
     @Override 
     public void onClick(View view) 
     { 
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
      String imageFileName = timeStamp + ".jpg"; 
      File storageDir = Environment.getExternalStoragePublicDirectory(
        Environment.DIRECTORY_PICTURES); 
      pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName; 
      File file = new File(pictureImagePath); 
      Uri outputFileUri = Uri.fromFile(file); 
      Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
      startActivityForResult(cameraIntent, 1); 
     } 
    }; 
    imgButton.setOnClickListener(imgButtonClickListener); 


} 



protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    Log.d("TAG","CUSTOOOM"); 
    if (requestCode == 1) 
    { 
     File imgFile = new File(pictureImagePath); 
     if (imgFile.exists()) 
     { 
      Bitmap myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath()); 
      ImageView myImage = (ImageView) findViewById(R.id.imageViewTest); 
      myImage.setImageBitmap(myBitmap); 

     } 
    } 






} 



} 

MainActivity.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context="com.example.nirvan.cameraexample3.MainActivity"> 

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageViewTest" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" /> 

<Button 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="IMG" 
    android:id="@+id/imgButton" 
    android:layout_alignParentTop="true" 
    android:layout_centerHorizontal="true" 
    android:layout_marginTop="56dp" /> 
</RelativeLayout> 
+0

尝试这可能是工作stackoverflow.com/a/41221852/5488468 –

回答

2

有一些问题

1)移动外oncreate

你的听众创作

2)使用的,而不是在创建新的

3.已创建的图像文件URI)确认RESULT_OK确认过

public class MainActivity extends AppCompatActivity { 

    private String pictureImagePath = ""; 
    private Uri outputFileUri; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button imgButton=(Button) findViewById(R.id.imgButton); 
     imgButton.setOnClickListener(imgButtonClickListener); 
    } 

    View.OnClickListener imgButtonClickListener=new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View view) 
      { 
       String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
       String imageFileName = timeStamp + ".jpg"; 
       File storageDir = Environment.getExternalStoragePublicDirectory(
         Environment.DIRECTORY_PICTURES); 
       pictureImagePath = storageDir.getAbsolutePath() + "/" + imageFileName; 
       File file = new File(pictureImagePath); 

       outputFileUri = Uri.fromFile(file); 
       // It's global to class now 

       Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
       cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
       startActivityForResult(cameraIntent, 1); 
      } 
     }; 


     protected void onActivityResult(int requestCode, int resultCode, Intent data) 
     { 
      Log.d("TAG","CUSTOOOM"); 
      if (requestCode == 1 && resultCode == RESULT_OK) 
      { 
       //RESULT_OK mean ,image taken successfully 
       // you can put a file exist check if you want 

       Bitmap myBitmap = BitmapFactory.decodeFile(outputFileUri); 
       ImageView myImage = (ImageView) findViewById(R.id.imageViewTest); 
       myImage.setImageBitmap(myBitmap); 
      } 
     } 
} 

您需要在您的清单中添加权限过于

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
...> 

    .. 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
... 
<manifest/> 

或者如果你的应用程序支持棉花糖及以上,那么你需要实现

Implement Run-time permission

+0

我试过这个,它不工作。 – Nirvan

+0

@Ghost你有'camera'并在你的清单中写入外部存储权限,如果没有的话添加它 –

+0

@Ghost首先尝试使用清单许可并让我知道是否有任何问题 –