Открыть камеру с помощью намерения
Я хочу использовать intent
открыть camera
в Android.
Я использовал следующий код, но когда я нажимаю button
(чье действие onclick()
Функция приложение закрывается на себя.
public void onclick(int actionCode){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, actionCode);
}
public static boolean isIntentAvailable(Context context, String action) {
final PackageManager packageManager = context.getPackageManager();
final Intent intent = new Intent(action);
List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Если кто-то может мне помочь.
6 ответов
File destination;
Uri selectedImage;
public static String selectedPath1 = "NONE";
private static final int PICK_Camera_IMAGE = 2;
private static final int SELECT_FILE1 = 1;
public static Bitmap bmpScale;
public static String imagePath;
mcamera = (Button) findViewById(R.id.button1);
mcamera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
String name = dateToString(new Date(), "yyyy-MM-dd-hh-mm-ss");
destination = new File(Environment
.getExternalStorageDirectory(), name + ".jpg");
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
Uri.fromFile(destination));
startActivityForResult(intent, PICK_Camera_IMAGE);
}
});
// ......................gallery_function..........//
mgallery = (Button) findViewById(R.id.button2);
mgallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
openGallery(SELECT_FILE1);
}
});
для намерения // ......................... функция галереи................. //
public void openGallery(int SELECT_FILE1) {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(
Intent.createChooser(intent, "Select file to upload "),
SELECT_FILE1);
}
//............ намерение.........
// ..................
protected void onActivityResult(int requestCode, int resultCode,
Intent imageReturnedIntent) {
super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
Uri selectedImageUri = null;
String filePath = null;
switch (requestCode) {
case SELECT_FILE1:
if (resultCode == Activity.RESULT_OK) {
selectedImage = imageReturnedIntent.getData();
if (requestCode == SELECT_FILE1) {
selectedPath1 = getPath(selectedImage);
// mimagepath.setText(selectedPath1);
// Toast.makeText(Camera.this, "" + selectedPath1 + "",
// 500).show();
if (selectedPath1 != null) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// image path `String` where your image is located
BitmapFactory.decodeFile(selectedPath1, options);
// Log.d("setpath ", "setpath " + selectedPath1);
;
}
}
break;
case PICK_Camera_IMAGE:
if (resultCode == RESULT_OK) {
try {
in = new FileInputStream(destination);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
imagePath = destination.getAbsolutePath();
// Toast.makeText(Camera.this, "" + imagePath +
// "",Toast.LENGTH_LONG).show();
break;
}
}
Попробуй этот код
public static final int CAMERA_PIC_REQUEST = 1;//firstly define this
Intent photo= new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(photo, CAMERA_PIC_REQUEST);
Параметр, передаваемый методу "при нажатии", имеет тип View
не int
как вы показываете.
Согласно этому руководству ваш метод onClick должен быть следующим:
public void onclick( View v ){
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(takePictureIntent, CAMERA_PIC_REQUEST);
}
куда CAMERA_PIC_REQUEST
определяется как (хотя я не совсем уверен, зачем вам нужно статически жестко кодировать это значение в вашем приложении):
private static final int CAMERA_PIC_REQUEST = 1337;
Обновить
CAMERA_PIC_REQUEST
используется для однозначной идентификации результата, возвращаемого onActivityResult
, множественный startActivityForResult
запросы могут быть невыполненными за один раз.
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_PIC_REQUEST) {
if (resultCode == RESULT_OK) {
tv.setText("Got picture!");
imageData = (Bitmap) data.getExtras().get("data");
ImageView image = (ImageView) findViewById(R.id.imageView1);
image.setImageBitmap(imageData);
} else if (resultCode == RESULT_CANCELED){
tv.setText("Cancelled");
}
}
}
Я знаю этот вопрос старый и ответил, но для тех, кто спрашивает, как получить файл изображения? вот решение.
String ExternalStorageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath();
String targetPath = ExternalStorageDirectoryPath + "/DCIM/Camera";
File targetDirector = new File(targetPath);
File[] files = targetDirector.listFiles()
String ImagePath = files[ file.files-1 ].getAbsolutePath();
Bitmap bmp = BitmapFactory.decodeFile(pathName);
ivImage.setImageBitmap( bmp );
Также вам не нужно добавлять разрешения камеры в ваш файл манифеста.
-Видитесь и проголосуйте, если это поможет вам
-Счастливое Кодирование..
Пожалуйста, посмотрите на этот код, это работает нормально со мной
//define the file-name to save photo taken by Camera activity
fileName = "new-photo-name.jpg";
//create parameters for Intent with filename
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION,"Image capture by camera");
imageUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
также примените этот метод для чтения изображения, когда вы взяли изображение с камеры.
//handling intent responses
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == Activity.RESULT_OK)
try {
if (bitmap != null) {bitmap.recycle();}
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(imageUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imageUriString = cursor.getString(column_index);
getContentResolver().notifyChange(imageUri, null);
ContentResolver cr = getContentResolver();
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
imageButtonPictureShop.setImageBitmap(bitmap);
// this.uploadImage (); this.executeMultipartPost (); // this.uploadFile (imageUriString); } catch (Exception e) {Toast.makeText (это, "Не удалось загрузить", Toast.LENGTH_SHORT).show(); if(e.getMessage()!= null)Log.e("Исключение", e.getMessage()); иначе Log.e ("Исключение", "Исключение"); e.printStackTrace(); }
}
catch (Exception e)
{
if(e.getMessage() != null)Log.e("Exception" , e.getMessage());
else Log.e("Exception" , "Exception");
e.printStackTrace();
}
super.onActivityResult(requestCode, resultCode, data);
}
Запустить камеру из приложения для Android очень просто: просто напишите двухстрочный код в методе onClick
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_PIC_REQUEST );
Добавьте одно постоянное поле в своем классе (вы можете использовать любое случайное число вместо 7)
private int CAMERA_PIC_REQUEST = 7;
После долгих исследований я нашел это решение. Чтобы прояснить ситуацию, я создал целое приложение для этого вопроса, которое служит для открытия камеры, щелчка по фотографии и установки изображения как ImageBitmap для ImageView. Код, задаваемый в этом вопросе, начинается со второго блока, то есть метода setView(), который находится ниже метода onCreate(), после которого у нас есть метод onActivityResult()
Вот демонстрация приложения.
Ниже я прикрепил файл MainActivity.java
package com.cr7.opencamera;
import android.Manifest;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.widget.Button;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
private Button buttonCaptureImageFromCamera;
private Uri imageUri;
private ImageView imageViewCameraImage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Button that will open the camera
buttonCaptureImageFromCamera = findViewById(R.id.buttonCaptureImageFromCamera);
// ImageView that will store the image
imageViewCameraImage = findViewById(R.id.imageViewCameraImage);
askPermission();
}
Здесь imageUri - глобальная переменная, поэтому ее можно использовать в методе onActivityResult().
// Sets OnClickListener for the button if storage permission is given
private void setView() {
buttonCaptureImageFromCamera.setOnClickListener(v -> {
String fileName = "new-photo-name.jpg";
// Create parameters for Intent with filename
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, fileName);
values.put(MediaStore.Images.Media.DESCRIPTION, "Image capture by camera");
imageUri =
getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
values);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, 1231);
});
}
Это метод onActivityResult. Здесь я использовал imageUri, то есть глобальную переменную типа Uri, которая была инициализирована в OnClickListener кнопки в методе setView() выше.
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1231 && resultCode == Activity.RESULT_OK) {
try {
ContentResolver cr = getContentResolver();
try {
// Creating a Bitmap with the image Captured
Bitmap bitmap = MediaStore.Images.Media.getBitmap(cr, imageUri);
// Setting the bitmap as the image of the
imageViewCameraImage.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
}
} catch (IllegalArgumentException e) {
if (e.getMessage() != null)
Log.e("Exception", e.getMessage());
else
Log.e("Exception", "Exception");
e.printStackTrace();
}
}
}
Остающийся код...
// Asking user for storage permission
public void askPermission() {
// Checking if the permissions are not granted.
if (
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED ||
ContextCompat.checkSelfPermission(
this,
android.Manifest.permission.READ_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
// If not granted requesting Read and Write storage
ActivityCompat.requestPermissions(this, /*You can ask for multiple request by adding
more permissions to the string*/new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 60);
} else {
// If permissions are granted we proceed by setting an OnClickListener for the button
// which helps the user pick the image
setView();
}
}
// This method is called after the permissions have been asked i.e. the dialog that says
// allow or deny
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
// Now by default we assume that the permission has not been granted
boolean allPermissionsGranted = false;
// Now we check if the permission was granted
if ( requestCode == 60 && grantResults.length > 0) {
// If all the permissions are granted allPermissionsGranted is set to true else false
allPermissionsGranted = grantResults[0] == PackageManager.PERMISSION_GRANTED
&&
grantResults[1] == PackageManager.PERMISSION_GRANTED;
}
// If permissions are granted we call the setView Method which prompts the user to pick
// an Image either by the clicking it now or picking from the gallery
if ( allPermissionsGranted ) {
setView();
}
}
}
Эти блоки кода расположены последовательно, т.е. если вы объедините все эти блоки, вы получите полный класс MainActivity.java.
Если вы хотите реализовать это приложение, вам нужно создать файл макета с ImageView с идентификатором "imageViewCameraImage" и кнопку с идентификатором "buttonCaptureImageFromCamera".
Надеюсь это поможет. Я знаю, что это долго, и пишу это еще дольше. С уважением, Джоэл