Android addCallback SurfaceHolder错误并在另一个线程中拍照

时间:2014-12-17 21:52:57

标签: android

我正在开发一款相机应用,我遇到了一个问题。更多细节如下。我还需要帮助将图片保存在另一个帖子中。

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

当我将“实现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开发很陌生。

提前致谢!

1 个答案:

答案 0 :(得分:4)

我希望你找到了答案。但无论哪种方式,我遇到了类似的问题,我想出来了,我在搜索解决方案时最终到了这里。

解决方案是将工具添加到类

public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback 
    {...}

Source Article