在Android中,可以通过使用相机API来从摄像头获取当前拍摄的照片位置。以下是一种实现方法:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
import android.content.Context;
import android.hardware.Camera;
import android.os.Environment;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CameraHelper implements SurfaceHolder.Callback, Camera.PictureCallback {
private static final String TAG = "CameraHelper";
private Camera mCamera;
private SurfaceHolder mHolder;
private Context mContext;
public CameraHelper(Context context, SurfaceView surfaceView) {
mContext = context;
mHolder = surfaceView.getHolder();
mHolder.addCallback(this);
}
public void takePicture() {
if (mCamera != null) {
mCamera.takePicture(null, null, this);
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera = Camera.open();
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.e(TAG, "Error setting camera preview: " + e.getMessage());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
if (mHolder.getSurface() == null) {
return;
}
try {
mCamera.stopPreview();
} catch (Exception e) {
Log.e(TAG, "Error stopping camera preview: " + e.getMessage());
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e) {
Log.e(TAG, "Error starting camera preview: " + e.getMessage());
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
releaseCamera();
}
@Override
public void onPictureTaken(byte[] data, Camera camera) {
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
Log.e(TAG, "Error creating media file, check storage permissions");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (IOException e) {
Log.e(TAG, "Error saving picture: " + e.getMessage());
}
// 在这里可以获取到照片的位置信息
// 你可以使用定位服务获取当前位置,并将位置信息与照片关联起来
// 例如,使用腾讯云的位置服务,可以通过以下方式获取位置信息:
// TencentLocationManager locationManager = TencentLocationManager.getInstance(mContext);
// TencentLocationListener locationListener = new TencentLocationListener() {
// @Override
// public void onLocationChanged(TencentLocation location, int error, String reason) {
// if (error == TencentLocation.ERROR_OK) {
// double latitude = location.getLatitude();
// double longitude = location.getLongitude();
// // 将位置信息与照片关联起来
// }
// }
// };
// locationManager.requestSingleFreshLocation(null, locationListener, null);
}
private File getOutputMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "CameraDemo");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_" + timeStamp + ".jpg");
return mediaFile;
}
private void releaseCamera() {
if (mCamera != null) {
mCamera.release();
mCamera = null;
}
}
}
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_CAMERA_PERMISSION = 200;
private SurfaceView mPreview;
private Button mCaptureButton;
private CameraHelper mCameraHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPreview = findViewById(R.id.preview_surface);
mCaptureButton = findViewById(R.id.capture_button);
mCaptureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
} else {
captureImage();
}
}
});
mCameraHelper = new CameraHelper(this, mPreview);
}
private void captureImage() {
mCameraHelper.takePicture();
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
captureImage();
}
}
}
}
以上代码演示了如何在Android中从摄像头获取当前拍摄的照片位置。你可以根据自己的需求进行修改和扩展。
领取专属 10元无门槛券
手把手带您无忧上云