Съемка с помощью камеры на Android программно
Я создал приложение с кнопкой и написал onClickListener для этой кнопки. Я пробовал несколько примеров кода, и ни один из них не работал. Все они поднимают приложение для Android-камеры и не делают фотографий. Мне нужен какой-то код, который я могу поместить в свой onClickListener, поэтому, когда я нажимаю кнопку на экране, будет сделан снимок.
Как я могу сделать снимок камеры, когда я нажимаю кнопку в Android деятельности?
7 ответов:
посмотрите на следующий демо-код.
вот ваш XML-файл для пользовательского интерфейса,
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/btnCapture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Camera" /> </LinearLayout>
и вот ваш файл класса Java,
public class CameraDemoActivity extends Activity { int TAKE_PHOTO_CODE = 0; public static int count = 0; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // Here, we are making a folder named picFolder to store // pics taken by the camera using this application. final String dir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/picFolder/"; File newdir = new File(dir); newdir.mkdirs(); Button capture = (Button) findViewById(R.id.btnCapture); capture.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Here, the counter will be incremented each time, and the // picture taken by camera will be stored as 1.jpg,2.jpg // and likewise. count++; String file = dir+count+".jpg"; File newfile = new File(file); try { newfile.createNewFile(); } catch (IOException e) { } Uri outputFileUri = Uri.fromFile(newfile); Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); startActivityForResult(cameraIntent, TAKE_PHOTO_CODE); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == TAKE_PHOTO_CODE && resultCode == RESULT_OK) { Log.d("CameraDemo", "Pic saved"); } } }
Примечание:
укажите следующие разрешения в файле манифеста,
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
есть два способа сделать фотографию:
1-Использование намерения сделать фотографию
2-использование API камеры
Я думаю, что вы должны использовать второй способ и есть пример кода здесь две из них.
вы можете использовать волшебную библиотеку фотографий.
1. попробуйте с компиляцией в gradle
compile 'com.frosquivel:magicaltakephoto:1.0'
2. Вам нужно это разрешение в манифесте.xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.CAMERA"/>
3. экземпляр класса, как это
// " это " - текущая активность param
MagicalTakePhoto magicalTakePhoto = new MagicalTakePhoto(this,ANY_INTEGER_0_TO_4000_FOR_QUALITY);
4. если вам нужно сделать снимок, используйте метод
magicalTakePhoto.takePhoto("my_photo_name");
5. если вам нужно выберите изображение в устройстве, попробуйте с помощью метода:
magicalTakePhoto.selectedPicture("my_header_name");
6. Вам нужно переопределить метод onActivityResult действия или фрагмента следующим образом:
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); magicalTakePhoto.resultPhoto(requestCode, resultCode, data); // example to get photo // imageView.setImageBitmap(magicalTakePhoto.getMyPhoto()); }
Примечание: только с этой библиотекой вы можете взять и выбрать изображение в устройстве, это использовать min API 15.
для тех, кто пришел сюда в поисках способа делать снимки/фотографии программно с помощью камеры Android и Camera2 API, взгляните на образец с открытым исходным кодом, предоставленный самим Google здесь.
возьмите и сохраните изображение в нужной папке
//Global Variables private static final int CAMERA_IMAGE_REQUEST = 101; private String imageName;
сфотографировать функция
public void captureImage() { // Creating folders for Image String imageFolderPath = Environment.getExternalStorageDirectory().toString() + "/AutoFare"; File imagesFolder = new File(imageFolderPath); imagesFolder.mkdirs(); // Generating file name imageName = new Date().toString() + ".png"; // Creating image here Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(imageFolderPath, imageName))); startActivityForResult(takePictureIntent, CAMERA_IMAGE_REQUEST); }
широковещательная новое изображение добавлено в противном случае pic не будет виден в галерее изображений
public void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub super.onActivityResult(requestCode, resultCode, data); if (resultCode == Activity.RESULT_OK && requestCode == CAMERA_IMAGE_REQUEST) { Toast.makeText(getActivity(), "Success", Toast.LENGTH_SHORT).show(); //Scan new image added MediaScannerConnection.scanFile(getActivity(), new String[]{new File(Environment.getExternalStorageDirectory() + "/AutoFare/" + imageName).getPath()}, new String[]{"image/png"}, null); // Work in few phones if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse(Environment.getExternalStorageDirectory() + "/AutoFare/" + imageName))); } else { getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse(Environment.getExternalStorageDirectory() + "/AutoFare/" + imageName))); } } else { Toast.makeText(getActivity(), "Take Picture Failed or canceled", Toast.LENGTH_SHORT).show(); } }
разрешения
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />