1

Androidで写真をキャプチャしようとして数日かかります。画像をキャプチャしたら、ファイルをFTPにアップロードするという考えです。SurfaceView を拡張するクラスがあり、それが表示されると、デバイスの背面カメラの画像が再生されます。カメラの画像をクリックして、画像をJPEG形式で保存したいと思います。

私は何十もの解決策を試しましたが、今得られるのは JPEG の完全な黒です。私は正しいと思いますが、何かが欠けています。

カスタム クラスの onClick イベントで使用するコードは次のとおりです。

    try {
        //create bitmap screen capture
        Bitmap bitmap;
        this.setDrawingCacheEnabled(true);
        //Freezes the image
        mCamera.stopPreview();
        bitmap = Bitmap.createBitmap(getDrawingCache(), 0, 0, this.getLayoutParams().width, this.getLayoutParams().height);
        this.setDrawingCacheEnabled(false);
        //Create temp file          
        file = File.createTempFile("prueba", ".JPG", Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES));
        //Copy bitmap content into file
        FileOutputStream fos = new FileOutputStream(file);
        bitmap.compress(CompressFormat.JPEG, 60, fos);
        fos.flush();
        fos.close();            
        //Free camera
        mCamera.release();
        mCamera = null;
    }catch(Exception e){
        e.printStackTrace();
    }

mCamera は android.hardware.Camera で、特定のサイズが選択され、幅と高さが適切に収まるように this.layoutParams にコピーされます。これらはすべて surfaceCreated() メソッドで行われます。

誰かが私を助けてくれることを願っています。

どうもありがとうございました。

4

2 に答える 2

0

ビットマップに有効なデータがあるかどうかはわかりませんが、あなたが求めていることを行う一般的な方法は、 startActivityForResult のいずれかでカメラを起動して画像を取得することです。

Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

または、カメラ プレビューのコールバックをアタッチすると、そこで画像フレームを処理できますhttp://developer.android.com/reference/android/hardware/Camera.html#setPreviewCallback(android.hardware.Camera.PreviewCallback)

ユーザーが写真を撮れるようにすることだけが必要な場合は、上記のようにインテントを起動することが解決策だと思います。これは、私が書いたアプリの 1 つにある、動作するコード スニペットです。

    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);

    // we want the camera image to be put in a specific place
    File path;
    try { 
        path = new File(getCameraStoragePath());
    } catch (Exception e1) { 
        e1.printStackTrace();
        return;
    }                     

    SimpleDateFormat timeStampFormat = new SimpleDateFormat("yyyyMMddHHmmssSS");
    mFilename = mPeer + "." + timeStampFormat.format(new java.util.Date()) + ".jpg";

    try
    { 
        mPath = path.getCanonicalPath();
    } catch (IOException e)
    { 
        e.printStackTrace();
    } 

    File out = new File(path, mFilename);
    android.net.Uri uri = android.net.Uri.fromFile(out);

    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);
    activity.startActivityForResult(intent, CAMERA);

次に、独自の onActivityResult を実装して、ユーザーが撮影した後に画像を処理します。

protected void onActivityResult(int requestCode, int resultCode, Intent data);
于 2013-07-19T20:06:28.113 に答える