所以,我(还)尝试构建一个简单的相机应用程序,到目前为止我所拥有的是一个能够拍照的图像控制器,将其保存到存储中并通过意图传递文件路径另一项活动。
在我的新活动中,我要实现的第一步是,将我的最终图像加载到ImageView中,所以我做了以下内容:
const Items = [{
parentValidators: [{
isValid: true
}, {
isValid: false
}, {
isValid: false
}]
},
{
parentValidators: [{
isValid: true
}, {
isValid: false
}, {
isValid: false
}]
}
]
// i tried :
function validateSection() {
return Items.every(validators => validators.parentValidators.some(i => i.isValid));
}
console.log(validateSection())
但是,它不起作用,我不太清楚为什么不...... :(活动开始完全正常,但ImageView什么都不做。
答案 0 :(得分:1)
在Android中保存图片的过程中,您必须了解的一些内容
ccv2WithPreview.takePicture();
在这一行中,执行的方法是
public void takePicture() {
try {
// This is how to tell the camera to lock focus.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);
// Tell #mCaptureCallback to wait for the lock.
mState = STATE_WAITING_LOCK;
mCaptureSession.capture(mPreviewRequestBuilder.build(), mCaptureCallback, backgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}
Toast.makeText(activity.getApplicationContext(), file.getAbsolutePath(), Toast.LENGTH_SHORT).show();
}
在此方法中,capture()调用是异步的。由于您在调用它并开始新的Activity之后很快就会结束活动,所以当您的代码将图像保存在Image Saver中时,您已经开始使用新的Activity并且您的文件尚未就绪。
按钮实现有效,因为当您单击按钮时,图像将被保存。
要解决此问题,
<强> CameraHelper.java 强>
public interface CameraHelper{
void fileSaved(String filePath);
}
<强> MainActivity.java 强>
public class MainActivity extends AppCompatActivity
implements SensorEventListener, ActivityCompat.OnRequestPermissionsResultCallback, CameraHelper{
...
@Override
public void fileSaved(String file){
Intent intent = new Intent(this, AfterActivity.class);
intent.putExtra("filePath", file);
startActivity(intent);
finish();
}
}
在MainActivity的onCreate
ccv2WithPreview = new CameraControllerV2WithPreview(MainActivity.this, textureView, MainActivity.this);
在相机课程中
private CameraHelper cameraHelper; //Initialize in constructor
然后在ImageSaver中
private boolean imageSaved = false;
public void run() {
if(!imageSaved) {
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);
try (FileOutputStream output = new FileOutputStream(mFile)) {
output.write(bytes);
imageSaved = true;
cameraHelper.fileSaved(mFile.getAbsolutePath());
} catch (IOException e) {
e.printStackTrace();
} finally {
mImage.close();
}
}
}
这是您必须处理将来获得的任何异步任务的方法。基于回调的实现。
答案 1 :(得分:0)
设置位图后,您可以尝试invalidate()
ImageView吗?
(我在这里猜很多,但几年前使用GUI,我记得如果一个视图发生了变化,你必须告诉视图,以便重新绘制它。)< / p>