프로그래밍 방식으로 Android에서 카메라로 사진 촬영
버튼이있는 앱을 만들고 해당 버튼에 대한 onClickListener를 작성했습니다. 몇 가지 샘플 코드 예제를 시도했지만 아무것도 작동하지 않았습니다. 그들은 모두 안드로이드 카메라 앱을 불러오고 사진을 찍지 않습니다. onClickListener에 넣을 수있는 코드가 필요해서 화면의 버튼을 누르면 사진이 찍 힙니다.
Android 활동에서 버튼을 누를 때 카메라가 사진을 찍도록하려면 어떻게해야합니까?
다음 데모 코드를보십시오.
다음은 UI 용 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 사용
두 번째 방법을 사용해야한다고 생각하며 여기 에 두 가지 샘플 코드 가 있습니다.
Magical Take Photo 라이브러리를 사용할 수 있습니다.
1. gradle에서 컴파일 시도
compile 'com.frosquivel:magicaltakephoto:1.0'
2. manifest.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. 이와 같은 클래스 인스턴스
// "this"는 현재 활동 매개 변수입니다.
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());
}
참고 :이 라이브러리를 통해서만 장치에서 사진을 찍고 선택할 수 있으며 최소 API 15를 사용합니다.
원하는 폴더에 이미지 촬영 및 저장
//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);
}
브로드 캐스트 새 이미지가 추가되었습니다. 그렇지 않으면 사진이 이미지 갤러리에 표시되지 않습니다.
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" />
For those who came here looking for a way to take pictures/photos programmatically using both Android's Camera and Camera2 API, take a look at the open source sample provided by Google itself here.
The following is a simple way to open the camera:
private void startCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI.getPath());
startActivityForResult(intent, 1);
}
Intent takePhoto = new Intent("android.media.action.IMAGE_CAPTURE");
startActivityForResult(takePhoto, CAMERA_PIC_REQUEST)
and set CAMERA_PIC_REQUEST= 1 or 0
ReferenceURL : https://stackoverflow.com/questions/14421694/taking-pictures-with-camera-on-android-programmatically
'developer tip' 카테고리의 다른 글
Eclipse의 Android 기기에 Nexus7이 표시되지 않음 (0) | 2020.12.29 |
---|---|
jQuery 및 Twitter Bootstrap을 사용하여 활성 탭 찾기 (0) | 2020.12.29 |
JavaScript에서 기본 부울 값을 설정하는 방법은 무엇입니까? (0) | 2020.12.29 |
3 개 테이블의 PostgreSQL JOIN 데이터 (0) | 2020.12.29 |
Flask로 교차 오리진 리소스 공유 해결 (0) | 2020.12.29 |