安卓拍照无用户界面 [英] Android: Take Photo Without User Interface
问题描述
我对写作的Android的应用程序,其中一个特定的事件,在应用程序后,照片会自动使用相机上的机器人拍摄。
I am interested in writing an app for android where after a certain event in the app a photo is automatically taken using the camera on the android.
我需要的东西:
-
没有$ P $照片PVIEW
No Preview of photo
没有按钮供用户preSS拍照
No Button for User to press to take the photo
只要运行操作拍摄照片并将其存储到相册中。
Just run the operation to take a photo and store it to the album.
下面是一个在线教程约codeI尝试:
here is some code i tried from a tutorial online:
public void snap(){
mCamera = Camera.open();
SurfaceView sv = new SurfaceView(getApplicationContext());
try {
mCamera.setPreviewDisplay(sv.getHolder());
parameters = mCamera.getParameters();
//set camera parameters
mCamera.setParameters(parameters);
mCamera.startPreview();
mCamera.takePicture(null, null, mCall);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Get a surface
sHolder = sv.getHolder();
}
Camera.PictureCallback mCall = new Camera.PictureCallback()
{
public void onPictureTaken(byte[] data, Camera camera)
{
//decode the data obtained by the camera into a Bitmap
FileOutputStream outStream = null;
try{
outStream = new FileOutputStream("/sdcard/Image.jpg");
outStream.write(data);
outStream.close();
} catch (FileNotFoundException e){
Log.d("CAMERA", e.getMessage());
} catch (IOException e){
Log.d("CAMERA", e.getMessage());
}
}
};
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
随着它的所作所为的logcat的
along with the logcat of what it did
11-24 01:54:37.738: E/AndroidRuntime(6971): FATAL EXCEPTION: main
11-24 01:54:37.738: E/AndroidRuntime(6971): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.udptest/com.example.udptest.Main}: java.lang.RuntimeException: takePicture failed
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2358)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.access$600(ActivityThread.java:153)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1247)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.os.Handler.dispatchMessage(Handler.java:99)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.os.Looper.loop(Looper.java:137)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.main(ActivityThread.java:5227)
11-24 01:54:37.738: E/AndroidRuntime(6971): at java.lang.reflect.Method.invokeNative(Native Method)
11-24 01:54:37.738: E/AndroidRuntime(6971): at java.lang.reflect.Method.invoke(Method.java:511)
11-24 01:54:37.738: E/AndroidRuntime(6971): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
11-24 01:54:37.738: E/AndroidRuntime(6971): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
11-24 01:54:37.738: E/AndroidRuntime(6971): at dalvik.system.NativeStart.main(Native Method)
11-24 01:54:37.738: E/AndroidRuntime(6971): Caused by: java.lang.RuntimeException: takePicture failed
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.hardware.Camera.native_takePicture(Native Method)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.hardware.Camera.takePicture(Camera.java:1101)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.hardware.Camera.takePicture(Camera.java:1046)
11-24 01:54:37.738: E/AndroidRuntime(6971): at com.example.udptest.Main.snap(Main.java:129)
11-24 01:54:37.738: E/AndroidRuntime(6971): at com.example.udptest.Main.onCreate(Main.java:84)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.Activity.performCreate(Activity.java:5104)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
11-24 01:54:37.738: E/AndroidRuntime(6971): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2262)
11-24 01:54:37.738: E/AndroidRuntime(6971): ... 11 more
任何想法可能是怎么回事,或者更好的方法来完成这项任务?
Any ideas what might be going on here, or a better way to accomplish this task?
推荐答案
这是服务拍摄照片的背景下,希望它可以帮助:
This is service to capture photo in background, hope it helps.:
public class CapPhoto extends Service
{
private SurfaceHolder sHolder;
private Camera mCamera;
private Parameters parameters;
@Override
public void onCreate()
{
super.onCreate();
Log.d("CAM", "start");
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);};
Thread myThread = null;
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
if (Camera.getNumberOfCameras() >= 2) {
mCamera = Camera.open(CameraInfo.CAMERA_FACING_FRONT); }
if (Camera.getNumberOfCameras() < 2) {
mCamera = Camera.open(); }
SurfaceView sv = new SurfaceView(getApplicationContext());
try {
mCamera.setPreviewDisplay(sv.getHolder());
parameters = mCamera.getParameters();
mCamera.setParameters(parameters);
mCamera.startPreview();
mCamera.takePicture(null, null, mCall);
} catch (IOException e) { e.printStackTrace(); }
sHolder = sv.getHolder();
sHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
Camera.PictureCallback mCall = new Camera.PictureCallback()
{
public void onPictureTaken(final byte[] data, Camera camera)
{
FileOutputStream outStream = null;
try{
File sd = new File(Environment.getExternalStorageDirectory(), "A");
if(!sd.exists()) {
sd.mkdirs();
Log.i("FO", "folder" + Environment.getExternalStorageDirectory());
}
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss");
String tar = (sdf.format(cal.getTime()));
outStream = new FileOutputStream(sd+tar+".jpg");
outStream.write(data); outStream.close();
Log.i("CAM", data.length + " byte written to:"+sd+tar+".jpg");
camkapa(sHolder);
} catch (FileNotFoundException e){
Log.d("CAM", e.getMessage());
} catch (IOException e){
Log.d("CAM", e.getMessage());
}}
};
@Override
public IBinder onBind(Intent intent) {
return null;
}
public void camkapa(SurfaceHolder sHolder) {
if (null == mCamera)
return;
mCamera.stopPreview();
mCamera.release();
mCamera = null;
Log.i("CAM", " closed");
}
}
AndroidManifest.xml中
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<service android:name=".CapPhoto" android:enabled="true">
<intent-filter>
</intent-filter>
</service>
调用此在 MainActivity 可拨打服务:
Intent service;
....
Calendar cal = Calendar.getInstance();
service = new Intent(getBaseContext(), CapPhoto.class);
cal.add(Calendar.SECOND, 15);
//TAKE PHOTO EVERY 15 SECONDS
PendingIntent pintent = PendingIntent.getService(this, 0, service, 0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
60*60*1000, pintent);
startService(service);
这篇关于安卓拍照无用户界面的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!