有没有一种方法可以直接从另一个类调用一个类函数,而不用Java中的实例?
我有一个应用程序,我有一张照片,然后它应该发送数据从图片到另一个活动使用的意图 我试图在有没有一种方法可以直接从另一个类调用一个类函数,而不用Java中的实例?,java,android,Java,Android,我有一个应用程序,我有一张照片,然后它应该发送数据从图片到另一个活动使用的意图 我试图在jpegCallback中调用intent,但问题是在调用intent之前,我还需要通过preview类释放相机。但是,我无法从回调内部访问原始预览对象,因此我需要一种从回调内部调用MainActivity.doPictureResults()的方法。或者我需要一种方法,让侦听器在所有图片回调完成后启动 这是我的MainActivity类,它在mPreview变量中保存了Preview类的一个实例。jpegC
jpegCallback
中调用intent,但问题是在调用intent之前,我还需要通过preview类释放相机。但是,我无法从回调内部访问原始预览对象,因此我需要一种从回调内部调用MainActivity.doPictureResults()
的方法。或者我需要一种方法,让侦听器在所有图片回调完成后启动
这是我的MainActivity
类,它在mPreview
变量中保存了Preview
类的一个实例。jpegCallback
位于底部,我想从内部调用dopicturesults
,或者在该函数完成后设置另一个回调
public class MainActivity extends Activity {
private final String TAG = "MainActivity";
private Preview mPreview;
Camera mCamera;
int numberOfCameras;
int cameraCurrentlyLocked;
//The first rear facing camera
int defaultCameraId;
/**
* Constructor
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {Log.e(TAG, "onCreate");
super.onCreate(savedInstanceState);
//Hide the window title.
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
//Create a RelativeLayout container that will hold a SurfaceView,
//and set it as the content of our activity.
this.mPreview = new Preview(this);
setContentView(this.mPreview);
//Find the total number of cameras available
this.numberOfCameras = Camera.getNumberOfCameras();
//Find the ID of the default camera
CameraInfo cameraInfo = new CameraInfo();
for(int i = 0; i < this.numberOfCameras; i++) {
Camera.getCameraInfo(i, cameraInfo);
if(cameraInfo.facing == CameraInfo.CAMERA_FACING_BACK) {
this.defaultCameraId = i;
}
}
}
@Override
protected void onResume() {Log.e(TAG, "onResume");
super.onResume();
//Open the default i.e. the first rear facing camera.
this.mCamera = Camera.open();
this.cameraCurrentlyLocked = this.defaultCameraId;
this.mPreview.setCamera(mCamera);
}
@Override
protected void onPause() {Log.e(TAG, "onPause");
super.onPause();
//Because the Camera object is a shared resource, it's very
//Important to release it when the activity is paused.
this.mPreview.releaseCamera();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate our menu which can gather user input for switching camera
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.camera_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle item selection
switch (item.getItemId()) {
case R.id.switchCam:
//Check for availability of multiple cameras
if(this.numberOfCameras == 1) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(this.getString(R.string.camera_alert)).setNeutralButton("Close", null);
AlertDialog alert = builder.create();
alert.show();
return true;
}
//OK, we have multiple cameras.
//Release this camera -> cameraCurrentlyLocked
this.mPreview.releaseCamera();
//Acquire the next camera and request Preview to reconfigure parameters.
this.mCamera = Camera.open((this.cameraCurrentlyLocked + 1) % this.numberOfCameras);
this.cameraCurrentlyLocked = (this.cameraCurrentlyLocked + 1) % this.numberOfCameras;
this.mPreview.switchCamera(mCamera);
//Start the preview
this.mCamera.startPreview();
return true;
case R.id.takePicture:
this.mCamera.takePicture(null, null, jpegCallback);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
public void doPictureResults(byte[] data) {
this.mPreview.releaseCamera();
//Release the camera and send the results of the image to the GetResults view
Intent resultsIntent = new Intent(MainActivity.this, ImageProcessorActivity.class);
resultsIntent.putExtra("image_data", data);
startActivity(resultsIntent);
}
/**
* Handles data for jpeg picture when the picture is taken
*/
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera mCamera) {Log.e(TAG, "jpegCallback");
String baseExternalDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = String.format("Assist/%d.jpg", System.currentTimeMillis());
FileOutputStream outStream = null;
try {
//Create the directory if needed
File assistDirectory = new File(baseExternalDir + File.separator + "Assist");
assistDirectory.mkdirs();
// Write to SD Card
outStream = new FileOutputStream(baseExternalDir + File.separator + fileName);
outStream.write(data);
outStream.close();
}
catch (FileNotFoundException e) {
Log.e(TAG, "IOException caused by PictureCallback()", e);
}
catch (IOException e) {
Log.e(TAG, "IOException caused by PictureCallback()", e);
}
//This is the type of thing I WANT to do....but its not possible.
MainActivity.doPictureResults();
}
};
}
公共类MainActivity扩展活动{
私有最终字符串TAG=“MainActivity”;
私人审查;
麦克默拉照相机;
国际数码相机;
int CameracCurrentlyLocked;
//第一个后向摄像头
int-defaultCameraId;
/**
*建造师
*@param savedInstanceState
*/
@凌驾
受保护的void onCreate(Bundle savedInstanceState){Log.e(标记“onCreate”);
super.onCreate(savedInstanceState);
//隐藏窗口标题。
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_全屏);
//创建一个RelativeLayout容器,用于保存SurfaceView,
//并将其作为我们活动的内容。
this.mPreview=新预览(this);
setContentView(this.mPreview);
//查找可用相机的总数
this.numberOfCameras=Camera.getNumberOfCameras();
//查找默认摄影机的ID
camerRainfo camerRainfo=新的camerRainfo();
对于(int i=0;i相机当前锁定
此.mPreview.releaseCamera();
//获取下一个摄像头并请求预览以重新配置参数。
this.mCamera=Camera.open((this.cameraccurrentlyclocked+1)%this.numberofcamera);
this.cameraCurrentlyLocked=(this.cameraCurrentlyLocked+1)%this.numberOfCameras;
这个.mPreview.switchCamera(mCamera);
//开始预览
this.mCamera.startPreview();
返回true;
案例R.id.拍摄照片:
this.mCamera.takePicture(null,null,jpegCallback);
返回true;
违约:
返回super.onOptionsItemSelected(项目);
}
}
public void doPictureResults(字节[]数据){
此.mPreview.releaseCamera();
//释放相机并将图像结果发送到GetResults视图
Intent resultsIntent=新的Intent(MainActivity.this、ImageProcessorActivity.class);
结果内容putExtra(“图像数据”,数据);
起始触感(结果含量);
}
/**
*拍摄图片时处理jpeg图片的数据
*/
PictureCallback jpegCallback=新建PictureCallback(){
public void onPictureTaken(字节[]数据,Camera mCamera){Log.e(标记,“jpegCallback”);
字符串baseExternalDir=Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName=String.format(“Assist/%d.jpg”,System.currentTimeMillis());
FileOutputStream扩展流=null;
试一试{
//如果需要,创建目录
File assistDirectory=新文件(baseExternalDir+File.separator+“Assist”);
assistDirectory.mkdirs();
//写入SD卡
outStream=新文件OutputStream(baseExternalDir+File.separator+文件名);
外扩。写入(数据);
exptream.close();
}
catch(filenotfound异常){
Log.e(标记“PictureCallback()引起的IOException”,e);
public class MainActivity extends Activity implements PictureCallback {
...
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
....
case R.id.takePicture:
this.mCamera.takePicture(null, null, this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
...
public void onPictureTaken(byte[] data, Camera mCamera) {
Log.d(TAG, "jpegCallback");
String baseExternalDir = Environment.getExternalStorageDirectory().getAbsolutePath();
String fileName = String.format("%d.jpg", System.currentTimeMillis());
...
doPictureResults();
}
}