Как открывать камеру телефона с Android?

Привет парни я обрабатываю информацию, которого, открыв мой app, первое, который делается, открылась камера, и у меня выходят несколько ошибок, я пробую осуществлять это таким образом:

introducir la descripción de la imagen aquí

Но я не смог этого добиваться.

2
задан 13.06.2017, 17:37
2 ответа

Добавил один способ это реализовывать, сначала добавь разрешения внутри AndroidManifest.xml:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />

Давайте верить в класс CameraView что основана на твоем первоначальном коде:

import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

import java.io.IOException;

public class CameraView extends SurfaceView implements SurfaceHolder.Callback {

    private SurfaceHolder mHolder;
    private Camera mCamera;

    public CameraView(Context context, Camera camera){
        super(context);

        mCamera = camera;
        mCamera.setDisplayOrientation(90);
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
    }

    @Override
    public void surfaceCreated(SurfaceHolder surfaceHolder) {
        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("ERROR", "Camera error on surfaceCreater" + e.getMessage());
        }

    }

    @Override
    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3) {
        if(mHolder.getSurface() == null)
            return;

        try{
            mCamera.stopPreview();
        } catch (Exception e){
            Log.e("ERROR",  e.getMessage());
        }

        try{
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();
        } catch (IOException e) {
            Log.d("ERROR", "Camera error on surfaceChanged " + e.getMessage());
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
        mCamera.stopPreview();
        mCamera.release();
    }
}

Чтобы загружать вид давайте верить в активность, в которой сначала мы определяем layout, activity_camera.xml:

<FrameLayout
    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"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/camera_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    </FrameLayout>

    <ImageButton
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imgClose"
        android:layout_gravity="right|top"
        android:background="@android:drawable/ic_menu_close_clear_cancel"
        android:padding="20dp"/>

</FrameLayout>

Мы определяем нашу активность, который дебет быть осмотренной внутри тебя AndroidManifest.xml :

import android.hardware.Camera;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;

public class CameraActivity extends AppCompatActivity {

    private static final String TAG = "CameraActivity";


    private Camera mCamera = null;
    private CameraView mCameraView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);

        try{
            mCamera = Camera.open();
        } catch (Exception e){
            Log.d("ERROR", "Failed to get camera: " + e.getMessage());
        }

        if(mCamera != null) {
            mCameraView = new CameraView(this, mCamera);
            FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);
            camera_view.addView(mCameraView);//agrega la vista CameraView()
        }

        //boton para cerrar la aplicación.
        ImageButton imgClose = (ImageButton)findViewById(R.id.imgClose);
        imgClose.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //Cierra la actividad.
                finish();
            }
        });

    }

}

Выполнив наше приложение, откроется камера:

introducir la descripción de la imagen aquí

В конце концов я комментирую тебе, что этот пример использует Для полуторной кровати класс, который устаревший с API 21, еще ты можешь использовать ее, но рекомендуется использование класса Camera2

Для Android 6.0 я добавляю метод, чтобы просить разрешения.

private void checkCameraPermission() {
    int permissionCheck = ContextCompat.checkSelfPermission(
            this, Manifest.permission.CAMERA);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
        Log.i("Mensaje", "No se tiene permiso para la camara!.");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 225);
    } else {
        Log.i("Mensaje", "Tienes permiso para usar la camara.");
    }
}
6
ответ дан 24.11.2019, 14:32
  • 1
    Помни, что для Android 6 он изменил способ просить разрешения. – HCarrasko 25.04.2016, 15:56
  • 2
    Спасибо Эктор, когда мы используем target sdk с нею и #250; ltima versi и # 243; n мы, должно быть, осуществляем petici и # 243; n разрешений, но для этого примера меня считаю достаточным. Тема разрешений для Android 6 - другая тема, которую конечно кто-то спрашивал в будущем, привете! – Jorgesys♦ 25.04.2016, 16:06
  • 3
    Я обновил ответ, добавляя м и # 233; все, чтобы просить разрешения в Android 6.0 – Jorgesys♦ 04.08.2016, 19:30

Дай эти разрешения в AndroidManifest.xml:

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

И потом эта Постоянная величина

public final static int RESP_TOMAR_FOTO = 1000; 

потом в методе, который ты хочешь:

public void onClickTomarFoto(View view) {

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    String filePath = Util.DirApp().getPath() + "/foto.jpg";

    Uri output = Uri.fromFile(new File(filePath));
    intent.putExtra(MediaStore.EXTRA_OUTPUT, output);
    startActivityForResult(intent, RESP_TOMAR_FOTO);
}

В конце концов чтобы получать ответ камеры:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (requestCode == RESP_TOMAR_FOTO && resultCode == RESULT_OK) {

    }
}
1
ответ дан 24.11.2019, 14:32

Теги

Похожие вопросы