【发布时间】:2015-08-29 03:05:49
【问题描述】:
我正在开发相机应用程序,但遇到了问题。更多详情如下。我还需要帮助将图片保存在另一个线程中。
1.错误
我得到的错误是:
error: method addCallback in interface SurfaceHolder cannot be applied to given types;
required: Callback
found: main
reason: actual argument main cannot be converted to Callback by method invocation conversion
代码:
public class main extends Activity {
Camera mCamera;
SurfaceView mPreview;
int camid = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPreview = (SurfaceView)findViewById(R.id.preview);
mPreview.getHolder().addCallback(SurfaceHolder.Callback);
mPreview.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
mCamera = Camera.open();
}
// REST OF THE CODE
}
错误所在的行:
mPreview.getHolder().addCallback(**SurfaceHolder.Callback**);
当我将“implements SurfaceHolder.Callback”添加到主类并将上面加粗的代码更改为 this 时,我得到了它的工作,但代码的其他部分无法使用 这个。我希望有其他方法可以解决此问题。
2。保存图片
当用户拍照时,设备会冻结一段时间,直到图片被压缩并添加水印。我想让应用程序立即向用户显示拍摄的照片,并且处理在另一个线程中完成,因此它不会冻结。
这是我当前的代码:
static Camera.PictureCallback jpegcallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
String timeStamp = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
String FileName = "IMG_" + timeStamp + ".jpg";
File saveFolder = new File(Environment.getExternalStorageDirectory() + "/App/");
File saveFile = new File(Environment.getExternalStorageDirectory() + "/App/" + FileName);
if(!saveFolder.exists()) {
saveFolder.mkdir();
}
if(!saveFile.exists()) {
saveFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(saveFile, false);
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
Bitmap workingBitmap = Bitmap.createBitmap(bitmap);
Bitmap mutableBitmap = workingBitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
Paint paint = new Paint();
paint.setColor(Color.WHITE); // Text Color
paint.setStrokeWidth(12); // Text Size
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); // Text Overlapping Pattern
canvas.drawBitmap(mutableBitmap, 0, 0, paint);
canvas.drawText("Fuse", 10, 10, paint);
mutableBitmap.compress(Bitmap.CompressFormat.JPEG, 80, fos);
fos.close();
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.TITLE, "Fuse Picture");
values.put(MediaStore.Images.Media.DESCRIPTION, "Fuse Picture");
values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis ());
values.put(MediaStore.Images.ImageColumns.BUCKET_ID, saveFile.toString().toLowerCase(Locale.US).hashCode());
values.put(MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME, saveFile.getName().toLowerCase(Locale.US));
values.put("_data", saveFile.getAbsolutePath());
/*ContentResolver cr = getContentResolver();
cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);*/
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
}
};
任何人都可以尝试让它在另一个线程中处理图片并给我代码以立即在 ImageView 上显示图像。此外,ContentResolver 有一个注释部分,当我取消注释该代码时,这部分 getContentResolver() 会出现错误。我在here 上找到了该代码。错误是:无法从静态上下文引用非静态方法 getContentResolver()。
很抱歉问了这么多,但我对 Android 开发还很陌生。
提前致谢!
【问题讨论】:
标签: android