gpt4 book ai didi

java - Android:无需用户界面拍照

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:46 26 4
gpt4 key购买 nike

我有兴趣为 android 编写一个应用程序,在应用程序中发生特定事件后,使用 android 上的相机自动拍摄照片。

我需要的东西:

  • 没有照片预览

  • 没有按钮让用户按下来拍照

  • 只需运行操作即可拍照并存储到相册。

这是我从在线教程中试过的一些代码:

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;
}

连同它做了什么的日志

    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

对这里可能发生的事情有什么想法,或者有更好的方法来完成这个任务吗?

最佳答案

这是在后台拍摄照片的服务,希望对您有所帮助。:

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);

关于java - Android:无需用户界面拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20172409/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com