【问题标题】:Android addCallback SurfaceHolder error and taking pictures in another threadAndroid addCallback SurfaceHolder报错并在另一个线程中拍照
【发布时间】: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


    【解决方案1】:

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

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

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

    Source Article

    【讨论】:

    • 感谢您的回答!我确实以某种方式自己解决了这个问题,但是我放弃了应用程序的开发。
    • 哈哈,那是爱好项目吗?
    • 是的。如果您想了解更多信息,可以联系我(查看我的个人资料)。我希望有人继续从事该项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多