Deixa ver se a gente tá falando a mesma coisa:
Ah, ok, entendi.
Tá instalando a que vc falou! jaja volto.
Deixa ver se a gente tá falando a mesma coisa:
Ah, ok, entendi.
Tá instalando a que vc falou! jaja volto.
Seu celular:
Android 9 (API 28)
Android Studio
Android 11 (API 30)
Vc tbm ta programando pra uma versão mínima de API (versão do android) no seu projeto. Isso vc pode ver em build.gradle
Então,
minSdkVersion 28// Tava 16
targetSdkVersion 30
Instalou a 21, Qual AVD vc sugere? Me refiro a isso:
Qual dos dois (minSdkVersion ou targetSdkVersion) devo alterar pra 21? minSdkVersion neh?
Não lembro mais as polegadas certinho, não tem nenhuma com 4.5 não?
Isso, minSdkVersiom
@wlcs22 , como os colega disseram, com essa configuração você vai ter muita dificuldade. Não é só a quantidade de ram, o seu processador também é fraco. Se não tem opção de outro computador, sugiro continuar ao menos um upgrade de memória ram, e continuar rodando no celular.
Estou ciente disso, é a mesma coisa com o GenyMotion. Mas, na minha experiência, eles mostraram desempenho bem melhor que o AVD, então sempre sugiro como opção.
Abraços.
Em relação a abrir duas camêras ao mesmo tempo, creio que seja problema na implementação do seu código. Poderia mandar parte do código para eu tentar ver o que você está fazendo?
Ok, alterado. Tem 4.0, testei e está na mesma.
@TerraSkilll, vc disse isso e o @rodriguesabner falou:
Fiquei confusa, 4GB vai ou não vai (boa)?
Olha… eu nem sabia que podia rodar o app nessas plataformas. como faz?
Bom… o app roda no celular normalmente. Certeza que a velocidade do PC influencia nisso, já que todo o código é compilado e rodado no celular? Bem, o resultado do código no cel é esse:
Só uma câmera é aberta por vez. A de baixo (frontal) não abre junto com a traseira. Se eu inverter o código, ele abre a frontal, mas não abre a traseira, ou seja, ele só abre uma câmera por vez. Esse código foi em cima do TextureView, mas também implementei outro código (Com o SurfaceView). O resultado é o mesmo que o TextureView.
Segue código no XML e na CLASSE:
XML:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="._TextureView.CustomCamActivity">
<TextureView
android:id="@+id/texture0"
android:layout_width="wrap_content"
android:layout_height="300dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"/>
<TextureView
android:id="@+id/texture1"
android:layout_width="0dp"
android:layout_height="300dp"
app:layout_constraintEnd_toEndOf="@+id/texture0"
app:layout_constraintStart_toStartOf="@+id/texture0"
app:layout_constraintTop_toBottomOf="@+id/texture0"/>
</androidx.constraintlayout.widget.ConstraintLayout>
CLASSE:
package sistema.dualcamera._TextureView;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CameraMetadata;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Size;
import android.util.SparseIntArray;
import android.view.Surface;
import android.view.TextureView;
import android.widget.Toast;
import java.util.Arrays;
import java.util.HashMap;
import sistema.dualcamera.R;
public class CustomCamActivity extends AppCompatActivity{
private static final String TAG = "CustomCamActivity";
private TextureView textureView0, textureView1;
int rotation;
private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static{
ORIENTATIONS.append(Surface.ROTATION_0, 90);
ORIENTATIONS.append(Surface.ROTATION_90, 0);
ORIENTATIONS.append(Surface.ROTATION_180, 270);
ORIENTATIONS.append(Surface.ROTATION_270, 180);
}
private String cameraId;
protected CameraDevice cameraDevice0, cameraDevice1;
protected CameraCaptureSession cameraCaptureSessions0, cameraCaptureSessions1;
protected CaptureRequest.Builder captureRequestBuilder0, captureRequestBuilder1;
private Size imageDimension0, imageDimension1;
private static final int REQUEST_CAMERA_PERMISSION = 1;
private Handler mBackgroundHandler0, mBackgroundHandler1;
private HandlerThread mBackgroundThread0, mBackgroundThread1;
@SuppressLint("UseSparseArrays")
private HashMap<Integer, HashMap<byte[], Integer>> images_map = new HashMap<>();
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_textureview_camera_frontal_traseira);
textureView0 = findViewById(R.id.texture0);
textureView1 = findViewById(R.id.texture1);
textureView0.setSurfaceTextureListener(new TextureView.SurfaceTextureListener(){
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
//open your camera here
openCamera0();
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture){
return false;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture){
}
});
textureView1.setSurfaceTextureListener(new TextureView.SurfaceTextureListener(){
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
//open your camera here
openCamera1();
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture){
return false;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture){
}
});
}
private final CameraDevice.StateCallback stateCallback0 = new CameraDevice.StateCallback(){
@Override
public void onOpened(CameraDevice camera){
cameraDevice0 = camera;
createCameraPreview0();
}
@Override
public void onDisconnected(CameraDevice camera){
cameraDevice0.close();
}
@Override
public void onError(CameraDevice camera, int error){
closeCamera0();
}
};
private final CameraDevice.StateCallback stateCallback1 = new CameraDevice.StateCallback(){
@Override
public void onOpened(CameraDevice camera){
cameraDevice1 = camera;
createCameraPreview1();
}
@Override
public void onDisconnected(CameraDevice camera){
cameraDevice1.close();
}
@Override
public void onError(CameraDevice camera, int error){
closeCamera1();
}
};
protected void startBackgroundThread0(){
mBackgroundThread0 = new HandlerThread("Camera Background0");
mBackgroundThread0.start();
mBackgroundHandler0 = new Handler(mBackgroundThread0.getLooper());
}
protected void startBackgroundThread1(){
mBackgroundThread1 = new HandlerThread("Camera Background1");
mBackgroundThread1.start();
mBackgroundHandler1 = new Handler(mBackgroundThread1.getLooper());
}
protected void stopBackgroundThread0(){
mBackgroundThread0.quitSafely();
try{
mBackgroundThread0.join();
mBackgroundThread0 = null;
mBackgroundHandler0 = null;
}
catch(InterruptedException e){
e.printStackTrace();
}
}
protected void stopBackgroundThread1(){
mBackgroundThread1.quitSafely();
try{
mBackgroundThread1.join();
mBackgroundThread1 = null;
mBackgroundHandler1 = null;
}
catch(InterruptedException e){
e.printStackTrace();
}
}
protected void createCameraPreview0(){
try{
SurfaceTexture texture0 = textureView0.getSurfaceTexture();
assert texture0 != null;
texture0.setDefaultBufferSize(imageDimension0.getWidth(), imageDimension0.getHeight());
Surface surface0 = new Surface(texture0);
captureRequestBuilder0 = cameraDevice0.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder0.addTarget(surface0);
cameraDevice0.createCaptureSession(Arrays.asList(surface0), new CameraCaptureSession.StateCallback(){
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession){
if(null == cameraDevice0){
return;
}
cameraCaptureSessions0 = cameraCaptureSession;
updatePreview0();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession){
Toast.makeText(CustomCamActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
}
}, null);
}
catch(CameraAccessException e){
e.printStackTrace();
}
}
protected void createCameraPreview1(){
try{
SurfaceTexture texture1 = textureView1.getSurfaceTexture();
assert texture1 != null;
texture1.setDefaultBufferSize(imageDimension1.getWidth(), imageDimension1.getHeight());
Surface surface1 = new Surface(texture1);
captureRequestBuilder1 = cameraDevice1.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
captureRequestBuilder1.addTarget(surface1);
cameraDevice1.createCaptureSession(Arrays.asList(surface1), new CameraCaptureSession.StateCallback(){
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession){
if(null == cameraDevice1){
return;
}
cameraCaptureSessions1 = cameraCaptureSession;
updatePreview1();
}
@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession){
Toast.makeText(CustomCamActivity.this, "Configuration change", Toast.LENGTH_SHORT).show();
}
}, null);
}
catch(CameraAccessException e){
e.printStackTrace();
}
}
private void openCamera0(){
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try{
String cameraId0 = manager.getCameraIdList()[0];
CameraCharacteristics characteristics0 = manager.getCameraCharacteristics(cameraId0);
StreamConfigurationMap map0 = characteristics0.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
assert map0 != null;
imageDimension0 = map0.getOutputSizes(SurfaceTexture.class)[0];
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(CustomCamActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CAMERA_PERMISSION);
return;
}
manager.openCamera(cameraId0, stateCallback0, null);
}
catch(CameraAccessException e){
e.printStackTrace();
}
}
private void openCamera1(){
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try{
String cameraId1 = manager.getCameraIdList()[1];
CameraCharacteristics characteristics1 = manager.getCameraCharacteristics(cameraId1);
StreamConfigurationMap map1 = characteristics1.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
assert map1 != null;
imageDimension1 = map1.getOutputSizes(SurfaceTexture.class)[1];
if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(CustomCamActivity.this, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_CAMERA_PERMISSION);
return;
}
manager.openCamera(cameraId1, stateCallback1, null);
}
catch(CameraAccessException e){
e.printStackTrace();
}
}
protected void updatePreview0(){
if(null == cameraDevice0){
}
captureRequestBuilder0.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
try{
cameraCaptureSessions0.setRepeatingRequest(captureRequestBuilder0.build(), null, mBackgroundHandler0);
}
catch(CameraAccessException e){
e.printStackTrace();
}
}
protected void updatePreview1(){
if(null == cameraDevice1){
}
captureRequestBuilder1.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_AUTO);
try{
cameraCaptureSessions1.setRepeatingRequest(captureRequestBuilder1.build(), null, mBackgroundHandler1);
}
catch(CameraAccessException e){
e.printStackTrace();
}
}
private void closeCamera0(){
if(null != cameraDevice0){
cameraDevice0.close();
cameraDevice0 = null;
}
}
private void closeCamera1(){
if(null != cameraDevice1){
cameraDevice1.close();
cameraDevice1 = null;
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){
if(requestCode == REQUEST_CAMERA_PERMISSION){
if(grantResults[0] == PackageManager.PERMISSION_DENIED){
// close the app
Toast.makeText(CustomCamActivity.this, "Sorry!!!, you can't use this app without granting permission", Toast.LENGTH_LONG).show();
finish();
}
}
}
@Override
protected void onResume(){
super.onResume();
startBackgroundThread0();
startBackgroundThread1();
if(textureView0.isAvailable() || textureView1.isAvailable()){
openCamera0();
openCamera1();
}
else{
textureView0.setSurfaceTextureListener(new TextureView.SurfaceTextureListener(){
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
//open your camera here
openCamera0();
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture){
return false;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture){
}
});
textureView1.setSurfaceTextureListener(new TextureView.SurfaceTextureListener(){
@Override
public void onSurfaceTextureAvailable(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
//open your camera here
openCamera1();
}
@Override
public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int i, int i1){
}
@Override
public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture){
return false;
}
@Override
public void onSurfaceTextureUpdated(@NonNull SurfaceTexture surfaceTexture){
}
});
}
}
@Override
protected void onPause(){
//closeCamera();
stopBackgroundThread0();
stopBackgroundThread1();
super.onPause();
}
}
PRONTO.
Desde já estou no aguardo de vcs! Grata!
Pode ignorar isso, ninguém tem 4gb de HD hoje em dia
nn, eu tava falando de RAM, @rodriguesabner, 4GB de RAM dá pra rodar o Android Studio sem ter falhas quando o app compilado chegar no celular? @deyversongoncalvesdg disse que sim.
dá sim, sem problemas. o único problema é a possível lentidão
Tá certo, vlw! Tô no aguardo da turma falar sobre o código, mas se quiserem eu abro outro tópico, na verdade já tem um.
A memória do computador ajuda o compilador e o Android Studio rodarem melhor, mas depois que o aplicativo já foi instalado no celular, não altera muito o funcionamento dele (já que, obviamente, o aplicativo está rodando no celular, não no PC). Se a compilação e a instalação concluem normalmente no PC (mesmo que demore), o aplicativo não vai ter falhas só porque o PC tem pouca RAM.
Quanto aos requisitos recomendados, recomendo você ignorar esses 4GB de RAM que é listado. Na minha opinião, é uma estimativa otimista. É possível rodar o Android Studio com 4GB, mas não vai ser agradável (como você mesmo já percebeu). Você tem que considerar que o Sistema Operacional também consome memória, assim como outros aplicativos instalados e serviços em segundo plano. Então, um PC com Windows 10 e 4GB de ram pode ter facilmente 1,5GB a 2GB ocupado só pelo Windows e serviços, deixando bem menos de 4GB para os outros programas. Se você ainda usar o navegador ao mesmo tempo, ele facilmente pode consumir mais de 1GB também. Por isso é que é ruim trabalhar com desenvolvimento com menos de 8GB de RAM.
Recomendo você separar os assuntos, senão fica tudo misturado demais e o título não vai condizer com o conteúdo. Não respondi mais no outro tópico porque realmente não sei como ajudar mais com esse problema em específico (abrir 2 câmeras simultaneamente).
Abraço.
Ok @TerraSkilll obg! Fico no aguardo de @deyversongoncalvesdg sobre as câmeras de preferência no outro post. @deyversongoncalvesdg, é só sinalizar que volto no outro tópico. Grata.
Recomendo que leia esse tópico:
Passei a vista por cima, mas agr vou ler com mais calma.
Esse eu já li, achei a pessoa confusa, pois ela fala:
De acordo com a documentação de Camera.open (int) :
Seu aplicativo deve ter apenas um objeto Câmera ativo por vez para uma câmera de hardware específica .
Isso significa que o hardware da câmera (frontal e traseira) é diferente e pode ser aberto ao mesmo tempo.
mas não sei se é exatamente isso que a turma do developer fala, até pq não se usa mais camera
, mas o camera2
.
Vc viu meu código? Se sim, rodou pra ver mais de perto?