【问题标题】:Camera not working?相机不工作?
【发布时间】:2018-01-05 07:30:58
【问题描述】:

我正在开发一个应用程序,只是为了打开相机并捕捉图像。我对此并不陌生,我无法理解我做错了什么。请有人帮我解决这个问题,我在这里发布我的 java 代码和 XML 代码:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
    android:id="@+id/textView2"
    android:layout_width="206dp"
    android:layout_height="172dp"
    android:layout_alignParentStart="true"
    android:layout_alignParentTop="true"
    android:text="2nd activity" />

    <Button
    android:id="@+id/button"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="69dp"
    android:layout_toEndOf="@+id/textView2"
    android:text="Camera"
    app:layout_constraintBottom_toTopOf="@+id/textView2"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0" />

    <ImageView
    android:id="@+id/camera"
    android:layout_width="100dp"
    android:layout_height="92dp"
    android:layout_above="@+id/button"
    android:layout_alignParentEnd="true"
    android:layout_marginBottom="119dp"
    android:layout_marginEnd="31dp"
    app:layout_constraintBottom_toTopOf="@+id/textView2"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toEndOf="@+id/button"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.0"
    app:srcCompat="@android:drawable/ic_menu_camera" />
    </RelativeLayout>

Java 代码

    package com.chiragsharmaengineer.linked_layouts;

    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.os.Bundle;
    import android.provider.MediaStore;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;



    public class newActivity extends Activity {

    final int CAMERA_PIC_REQUEST = 1888;

    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //Get the view from new_activity.xml
    setContentView(R.layout.activity_new);

    //Camera
    Button camera = (Button) findViewById(R.id.button);
    camera.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent cameraIntent = new 
        Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

           }
         });

        }

        protected void onActivityResult(int requestCode, int resultCode, 
        Intent data) {
        if (requestCode == CAMERA_PIC_REQUEST) {
        Bitmap image = (Bitmap) data.getExtras().get("data");
        ImageView imageview = findViewById(R.id.camera); //sets imageview as 
        the bitmap
        imageview.setImageBitmap(image);

            }
          } 
        } 

ImageView 选项未显示在布局上,每当我单击相机按钮时,它只会打开以前的布局。应用程序没有崩溃,但实际上没有做任何事情。如果您提供详细的解决方案,我将不胜感激。

【问题讨论】:

  • 也发布您的日志猫,以便我们知道应用程序崩溃的原因
  • 您是否添加了运行时权限?

标签: java android debugging


【解决方案1】:

试试这个

package com.chiragsharmaengineer.linked_layouts;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;



public class newActivity extends Activity {

final int CAMERA_PIC_REQUEST = 1888;
ImageView imageview ;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//Get the view from new_activity.xml
setContentView(R.layout.activity_new);

//Camera
 imageview = findViewById(R.id.camera); //sets imageview as 
Button camera = (Button) findViewById(R.id.button);
camera.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {

        Intent cameraIntent = new 
    Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);

       }
     });

    }

    @Override
   public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
   if (requestCode == CAMERA_PIC_REQUEST ) {
    Bitmap image = (Bitmap) data.getExtras().get("data");
    imageview.setImageBitmap(image);
    } 
 }

【讨论】:

    【解决方案2】:

    您忘记请求权限,因为 Marshmallow 您需要在运行时请求它们:

    1) 创建一个新的 java 类 PermissionUtils 并粘贴以下代码:

    import android.Manifest;
    import android.app.Activity;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.support.v4.app.ActivityCompat;
    
    public class PermissionUtils {
    
        public static final int REQUEST_EXTERNAL_STORAGE = 1000;
        public static final int REQUEST_CAMERA = 2000;
    
    
    
        public static void requestExternal(Activity context) {
            if (!checkExternal(context)) {
                ActivityCompat.requestPermissions(context, new String[]{
                                Manifest.permission.READ_EXTERNAL_STORAGE,
                                Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        REQUEST_EXTERNAL_STORAGE);
            }
        }
    
    
        public static void requestCamera(Activity context) {
            if (!checkCamera(context)) {
                ActivityCompat.requestPermissions(context, new String[]{
                                Manifest.permission.CAMERA},
                        REQUEST_CAMERA);
            }
        }
    
    
        public static boolean checkExternal(Context context) {
            return !(ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED
                    && ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED);
        }
    
    
        public static boolean checkCamera(Context context) {
            return !(ActivityCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED);
        }
    }
    

    2) 然后在您的 newActivity 类中,在 onCreate() 方法中添加这两行

    @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //Get the view from new_activity.xml 
        // Premission check lines go here!
        PermissionUtils.requestCamera(this);
        PermissionUtils.requestExternal(this);
    

    现在,该应用会在启动时询问您的权限,并且相机 Intent 将起作用。我还添加了 EXTERNAL_STORAGE 权限,因为我猜你想稍后保存图片,对吧?

    【讨论】:

      【解决方案3】:
      public void capturePhoto() {
              String myTargetImageFilePath = Environment.getExternalStorageDirectory().toString() + "/test.jpg";
      
              File cameraPhotoFile = new File(myTargetImageFilePath);
              Uri CameraFileUri = null;
              if (cameraPhotoFile == null) {
                  Toast.makeText(this,
                          "01 - Error: While getting the storage Name file for Camera ... ",
                          Toast.LENGTH_LONG).show();
              } else {
                  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                      CameraFileUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName()
                                      + ".provider",
                              cameraPhotoFile);
                  } else {
                      CameraFileUri = Uri.fromFile(cameraPhotoFile);
                  }
                  callToCamera(this,
                          CameraFileUri);
      
              }
          }
      
          public static void callToCamera(Activity theActivity, final Uri theCameraFileUri) {
      
                  System.out.println("theCameraFileUri:" + theCameraFileUri);
                  Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                  intent.putExtra(MediaStore.EXTRA_OUTPUT, theCameraFileUri); // set the image file name
                  theActivity.startActivityForResult(intent, SELECT_IMAGE_FROM_CAMERA_CODE);
          }
      
      
              @Override
          protected void onActivityResult(int requestCode, int resultCode, Intent data) {
              super.onActivityResult(requestCode, resultCode, data);
              if (requestCode == SELECT_IMAGE_FROM_CAMERA_CODE) {
                  //Here data is null because we are selecting image from camera
                  if (data == null) {
                      myImageViewSelected.setImageBitmap(createBitmap(myTargetImageFilePath.toString(), 300, 300));
                  }
              }
          }
      
      
          public static Bitmap createBitmap(String theTargetFile, int theReqHight, int theReqWidth) {
              BitmapFactory.Options bmOptions = new BitmapFactory.Options();
              Bitmap bitmap = BitmapFactory.decodeFile(theTargetFile, bmOptions);
              bitmap = Bitmap.createScaledBitmap(bitmap, theReqWidth, theReqHight, true);
              return bitmap;
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多