एक तस्वीर को बचाने के लिए एक इरादा डालें

मुझे नहीं पता कि मैं गलत कर रहा हूं, हर चीज ठीक लगती है, लेकिन जब मैं कैप्चर करता हूं तो टेलीफोन में कोई तस्वीर सहेजी नहीं जा रही है।

संदेश चित्र सहेजा जा रहा है, लेकिन मेरी गैलरी पर कुछ भी नहीं है।

public class MirrorActivity extends Activity implements PictureCallback {
private final static String DEBUG_TAG = "MirrorActivity";
private Camera mCam;
private MirrorView mCamPreview;
private int mCameraId = 0;
private FrameLayout mPreviewLayout;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);



   //do we have a camera?
    if (!getPackageManager()
            .hasSystemFeature(PackageManager.FEATURE_CAMERA)) {
        Toast.makeText(this, "No camera feature on this device",
                Toast.LENGTH_LONG).show();
    } else {

        mCameraId = findFirstFrontFacingCamera();

        if (mCameraId >= 0) {
            mPreviewLayout = (FrameLayout) findViewById(R.id.camPreview);
            mPreviewLayout.removeAllViews();

            startCameraInLayout(mPreviewLayout, mCameraId);

            Button takePic = (Button) findViewById(R.id.capture);
            takePic.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    mCam.takePicture(null, null, MirrorActivity.this);

                }
            });
        } else {
            Toast.makeText(this, "No front facing camera found.",
                    Toast.LENGTH_LONG).show();
        }
    }
}


@SuppressLint("NewApi")
private int findFirstFrontFacingCamera() {
    int foundId = -1;
   //find the first front facing camera
    int numCams = Camera.getNumberOfCameras();
    for (int camId = 0; camId < numCams; camId++) {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(camId, info);
        if (info.facing == CameraInfo.CAMERA_FACING_BACK) {
            Log.d(DEBUG_TAG, "Found back facing camera");
            foundId = camId;
            break;
        }
    }
    return foundId;
}

private void startCameraInLayout(FrameLayout layout, int cameraId) {

   //TODO pull this out of the UI thread.
    mCam = Camera.open(cameraId);
    if (mCam != null) {
        mCamPreview = new MirrorView(this, mCam);
        layout.addView(mCamPreview);
    }
}

@Override
protected void onResume() {
    super.onResume();
    if (mCam == null && mPreviewLayout != null) {
        mPreviewLayout.removeAllViews();
        startCameraInLayout(mPreviewLayout, mCameraId);
    }
}

@Override
protected void onPause() {
    if (mCam != null) {
        mCam.release();
        mCam = null;
    }
    super.onPause();
}

public void onPictureTaken(byte[] data, Camera camera) {
    File pictureFileDir = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
            "SimpleSelfCam");

    if (!pictureFileDir.exists() && !pictureFileDir.mkdirs()) {

        Log.d(DEBUG_TAG, "Can't create directory to save image");
        Toast.makeText(this, "Can't make path to save pic.",
                Toast.LENGTH_LONG).show();
        return;


    }

    String filename = pictureFileDir.getPath() + File.separator
            + "Picture.jpg";
    File pictureFile = new File(filename);

    try {
        FileOutputStream fos = new FileOutputStream(pictureFile);
        fos.write(data);
        fos.close();
        Toast.makeText(this, "Image saved as Picture.jpg",
                Toast.LENGTH_LONG).show();
    } catch (Exception error) {
        Log.d(DEBUG_TAG, "File not saved: " + error.getMessage());
        Toast.makeText(this, "Can't save image.", Toast.LENGTH_LONG).show();

    }
}

public class MirrorView extends SurfaceView implements
        SurfaceHolder.Callback {
    private SurfaceHolder mHolder;
    private Camera mCamera;

    public MirrorView(Context context, Camera camera) {
        super(context);
        mCamera = camera;
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        try {
            mCamera.setPreviewDisplay(holder);
            mCamera.startPreview();
        } catch (Exception error) {
            Log.d(DEBUG_TAG,
                    "Error starting mPreviewLayout: " + error.getMessage());
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w,
            int h) {
        if (mHolder.getSurface() == null) {
            return;
        }

       //can't make changes while mPreviewLayout is active
        try {
            mCamera.stopPreview();
        } catch (Exception e) {

        }

        try {
           //set rotation to match device orientation
            setCameraDisplayOrientationAndSize();

           //start up the mPreviewLayout
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

        } catch (Exception error) {
            Log.d(DEBUG_TAG,
                    "Error starting mPreviewLayout: " + error.getMessage());
        }

    }

    public void setCameraDisplayOrientationAndSize() {
        CameraInfo info = new CameraInfo();
        Camera.getCameraInfo(mCameraId, info);
        int rotation = getWindowManager().getDefaultDisplay().getRotation();
        int degrees = rotation * 90;

        /*
         *//the above is just a shorter way of doing this, but could break
         * if the values change switch (rotation) { case Surface.ROTATION_0:
         * degrees = 0; break; case Surface.ROTATION_90: degrees = 90;
         * break; case Surface.ROTATION_180: degrees = 180; break; case
         * Surface.ROTATION_270: degrees = 270; break; }
         */

        int result;
        if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
            result = (info.orientation + degrees) % 360;
            result = (360 - result) % 360;
        } else {
            result = (info.orientation - degrees + 360) % 360;
        }
        mCamera.setDisplayOrientation(result);

        Camera.Size previewSize = mCam.getParameters().getPreviewSize();
        if (result == 90 || result == 270) {
           //swap - the physical camera itself doesn't rotate in relation
           //to the screen ;)
            mHolder.setFixedSize(previewSize.height, previewSize.width);
        } else {
            mHolder.setFixedSize(previewSize.width, previewSize.height);

        }
    }

}

मुझे इन लाइनों को कहां रखना चाहिए ??

        Intent intent =new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
        intent.setData(Uri.fromFile(pictureFileDir));
        sendBroadcast(intent);
0
जोड़ा संपादित
विचारों: 1
मैं उन्हें वापस चित्र के बाद, चित्र के बाद, डाल दिया; अब चित्रित किया गया है .. मेरा मतलब है, यह गैलरी में कुछ बनाता है, लेकिन यह एक आइकन है, कोई छवि नहीं है, यह एक प्रकार की किरण के साथ एक आइकन है।
जोड़ा लेखक user3001794, स्रोत
हाँ! वह काम किया! एकमात्र बायीं समस्या यह है कि तस्वीर ली जाती है, लेकिन अगर मैं दूसरी तस्वीर लेता हूं, तो दूसरा दूसरा ओवरराइट करता है। ऐसा नहीं होता है अगर मैं एप्लिकेशन को बंद और दोबारा खोलता हूं .. अनुमान लगाओ कि कोड में कुछ अभी भी गायब है
जोड़ा लेखक user3001794, स्रोत
MediaScanner को बताने के लिए उन पंक्तियों की आवश्यकता है कि एक नई फ़ाइल जोड़ा गया है और स्कैन किया जाना चाहिए। यह गैलरी में दिखाई देगा। onPictureTaken के अंत में, चित्र सहेजे जाने के बाद उन्हें जोड़ें
जोड़ा लेखक Ken Wolf, स्रोत
इसे intent.setData (Uri.fromFile (फ़ाइल नाम) में बदलने का प्रयास करें;
जोड़ा लेखक Ken Wolf, स्रोत
मैंने इसका जवाब उत्तर में दिया है और आपको उपर्युक्त माध्यमिक मुद्दे के बारे में एक सुझाव दिया है। उम्मीद है की यह मदद करेगा।
जोड़ा लेखक Ken Wolf, स्रोत
कृपया इस उत्तर को स्वीकृत के रूप में चिह्नित करने पर विचार करें, यह महत्वपूर्ण है और यहां क्यों है: meta.stackexchange.com/a/5235 धन्यवाद!
जोड़ा लेखक Ken Wolf, स्रोत

1 उत्तर

मीडिया स्कैनर कॉल को यहां से बदलें:

intent.setData(Uri.fromFile(pictureFileDir));

सेवा मेरे:

intent.setData(Uri.fromFile(filename));

मूल कोड में आप इसे एक निर्देशिका पास कर रहे हैं - फिक्स इसे वास्तविक फ़ाइल नाम पास करना है।

तस्वीर को ओवरराइट करने के बारे में आपकी टिप्पणी के बारे में, यह डिज़ाइन द्वारा है क्योंकि आप लगातार नवीनतम फ़ाइल को एक फ़ाइल नाम में सहेज रहे हैं।

String filename = pictureFileDir.getPath() + File.separator
        + "Picture.jpg";

फिक्स निश्चित रूप से एक अद्वितीय फ़ाइल नाम का उपयोग करने के लिए है (टाइमस्टैंप, या सरल वृद्धि काउंटर)।

0
जोड़ा