Android中的Camera

自己才疏學(xué)淺工作中總是寫(xiě)相機(jī)這一塊,所以就總結(jié)了一下征懈,如有錯(cuò)誤請(qǐng)糾正鹰贵。

setUp0 相關(guān)權(quán)限(1)

  <!--相機(jī)訪(fǎng)問(wèn)權(quán)限-->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />

setUp0 相關(guān)權(quán)限6.0 (2)

public class CheckPermissionsUtil {
    private static final String TAG = "zhangxin";

    Context mContext;

    public CheckPermissionsUtil(Context mContext) {
        this.mContext = mContext;
    }

    private String[] needPermissions = {
            Manifest.permission.RECORD_AUDIO,
            Manifest.permission.WAKE_LOCK,
            Manifest.permission.CAMERA,
            Manifest.permission.WRITE_EXTERNAL_STORAGE,
            Manifest.permission.WRITE_SETTINGS
    };

    private boolean checkPermission(String... needPermissions) {
        for (String permission : needPermissions) {
            if (ActivityCompat.checkSelfPermission(mContext, permission) != PackageManager.PERMISSION_GRANTED) {
                return false;
            }
        }
        return true;
    }

    private void requestPermission(Activity activity, int code, String... needPermissions) {
        ActivityCompat.requestPermissions(activity, needPermissions, code);
        Log.i(TAG, "request Permission...");
    }
    public void requestAllPermission(Activity activity) {
        if (Build.VERSION.SDK_INT >= 23) {
            Log.i(TAG, "request All Permission...");
            for (String permission : needPermissions) {
                if (!checkPermission(permission)) {
                    requestPermission(activity, 0, permission);
                }
            }
        }
    }
}

setup1 先寫(xiě)一個(gè)轉(zhuǎn)換類(lèi)

public class DisplayUtil {
    private static final String TAG = "zhangxin";
    /**
     * dip轉(zhuǎn)px
     * @param context
     * @param dipValue
     * @return
     */
    public static int dip2px(Context context, float dipValue){            
        final float scale = context.getResources().getDisplayMetrics().density;                 
        return (int)(dipValue * scale + 0.5f);         
    }     
    
    /**
     * px轉(zhuǎn)dip
     * @param context
     * @param pxValue
     * @return
     */
    public static int px2dip(Context context, float pxValue){                
        final float scale = context.getResources().getDisplayMetrics().density;                 
        return (int)(pxValue / scale + 0.5f);         
    } 
    
    /**
     * 獲取屏幕寬度和高度争拐,單位為px
     * @param context
     * @return
     */
    public static Point getScreenMetrics(Context context){
        DisplayMetrics dm =context.getResources().getDisplayMetrics();
        int w_screen = dm.widthPixels;
        int h_screen = dm.heightPixels;
        Log.i(TAG, "Screen---Width = " + w_screen + " Height = " + h_screen + " densityDpi = " + dm.densityDpi);
        return new Point(w_screen, h_screen);
        
    }
    
    /**
     * 獲取屏幕長(zhǎng)寬比
     * @param context
     * @return
     */
    public static float getScreenRate(Context context){
        Point P = getScreenMetrics(context);
        float H = P.y;
        float W = P.x;
        return (H/W);
    }
}

setUp2 相機(jī)預(yù)覽大小最適尺寸

public class CamParaUtil {
    private static final String TAG = "zhangxin";
    private CameraSizeComparator sizeComparator = new CameraSizeComparator();
    private static CamParaUtil myCamPara = null;
    private CamParaUtil(){

    }
    public static CamParaUtil getInstance(){
        if(myCamPara == null){
            myCamPara = new CamParaUtil();
            return myCamPara;
        }
        else{
            return myCamPara;
        }
    }

    public  Size getPropPreviewSize(List<Camera.Size> list, float th, int minWidth){
        Collections.sort(list, sizeComparator);

        int i = 0;
        for(Size s:list){
            if((s.width >= minWidth) && equalRate(s, th)){
                Log.i(TAG, "PreviewSize:w = " + s.width + "h = " + s.height);
                break;
            }
            i++;
        }
        if(i == list.size()){
            i = 0;//如果沒(méi)找到,就選最小的size
        }
        return list.get(i);
    }
    public Size getPropPictureSize(List<Camera.Size> list, float th, int minWidth){
        Collections.sort(list, sizeComparator);

        int i = 0;
        for(Size s:list){
            if((s.width >= minWidth) && equalRate(s, th)){
                Log.i(TAG, "PictureSize : w = " + s.width + "h = " + s.height);
                break;
            }
            i++;
        }
        if(i == list.size()){
            i = 0;//如果沒(méi)找到蚊荣,就選最小的size
        }
        return list.get(i);
    }

    public boolean equalRate(Size s, float rate){
        float r = (float)(s.width)/(float)(s.height);
        if(Math.abs(r - rate) <= 0.03)
        {
            return true;
        }
        else{
            return false;
        }
    }

    public  class CameraSizeComparator implements Comparator<Camera.Size>{
        public int compare(Size lhs, Size rhs) {
            // TODO Auto-generated method stub
            if(lhs.width == rhs.width){
                return 0;
            }
            else if(lhs.width > rhs.width){
                return 1;
            }
            else{
                return -1;
            }
        }

    }

    /**打印支持的previewSizes
     * @param params
     */
    public  void printSupportPreviewSize(Camera.Parameters params){
        List<Size> previewSizes = params.getSupportedPreviewSizes();
        for(int i=0; i< previewSizes.size(); i++){
            Size size = previewSizes.get(i);
            Log.i(TAG, "previewSizes:width = "+size.width+" height = "+size.height);
        }
    
    }

    /**打印支持的pictureSizes
     * @param params
     */
    public  void printSupportPictureSize(Camera.Parameters params){
        List<Size> pictureSizes = params.getSupportedPictureSizes();
        for(int i=0; i< pictureSizes.size(); i++){
            Size size = pictureSizes.get(i);
            Log.i(TAG, "pictureSizes:width = "+ size.width
                    +" height = " + size.height);
        }
    }
    /**打印支持的聚焦模式
     * @param params
     */
    public void printSupportFocusMode(Camera.Parameters params){
        List<String> focusModes = params.getSupportedFocusModes();
        for(String mode : focusModes){
            Log.i(TAG, "focusModes--" + mode);
        }
    }
}

setUp3 相機(jī)工具類(lèi)

public class CameraInterface {
    private static final String TAG = "zhangxin";
    private Context context;
    private Camera.Parameters parameters;
    private boolean isPreview = false;
    private float mPreviewRate = -1f;
    private boolean autoFoucs;
    private int mCameraId = -1;
    private Camera camera;
    private static CameraInterface cameraInterface;

    public interface CameraOpenCallback {
        public void cameraHasOpen();
    }

    public CameraInterface() {

    }

    public static CameraInterface getInstance() {
        if (cameraInterface == null) {
            cameraInterface = new CameraInterface();
        }
        return cameraInterface;
    }

    /*打開(kāi)相機(jī)*/
    public void doOpenCamera(CameraOpenCallback callback, int mCameraId) {
        Log.i(TAG, "日志輸出-->: 打開(kāi)相機(jī)");
        camera = Camera.open(mCameraId);
        this.mCameraId = mCameraId;
        if (callback != null) {
            callback.cameraHasOpen();
        }

    }

    /*開(kāi)啟預(yù)覽*/
    public void doStartPreview(SurfaceHolder holder, float mPreviewRate) {
        Log.i(TAG, "日志輸出-->: 開(kāi)始預(yù)覽");
        if (isPreview) {
            camera.stopPreview();
            return;
        }
        if (camera != null) {
            parameters = camera.getParameters();
            /*設(shè)置拍照存儲(chǔ)格式*/
            parameters.setPictureFormat(PixelFormat.JPEG);
            CamParaUtil.getInstance().printSupportPictureSize(parameters);
            CamParaUtil.getInstance().printSupportPreviewSize(parameters);
            /*設(shè)置預(yù)覽和拍照大小*/
            Camera.Size picSize = CamParaUtil.getInstance().getPropPictureSize(parameters.getSupportedPictureSizes(), mPreviewRate, 800);
            Camera.Size preSize = CamParaUtil.getInstance().getPropPreviewSize(parameters.getSupportedPreviewSizes(), mPreviewRate, 800);
            camera.setDisplayOrientation(90);
            /*定焦*/
            CamParaUtil.getInstance().printSupportFocusMode(parameters);
            List<String> focusModes = parameters.getSupportedFocusModes();
            if (focusModes.contains("continuous-video")) {
                parameters.setFlashMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
                Log.e(TAG, "輸出信息-->: 開(kāi)啟對(duì)焦成功");
            }
            camera.setParameters(parameters);
            try {
                camera.setPreviewDisplay(holder);
                /*開(kāi)啟預(yù)覽*/
                camera.startPreview();
            } catch (IOException e) {
                e.printStackTrace();
                Log.e(TAG, "輸出信息-->: 開(kāi)啟預(yù)覽失敗" + e.getMessage());
            }
            isPreview = true;
            autoFoucs = true;
            camera.autoFocus(autoFocusCallback);
            this.mPreviewRate = mPreviewRate;
            parameters = camera.getParameters(); //重新get一次
            Log.i(TAG, "最終設(shè)置:PreviewSize--With = " + parameters.getPreviewSize().width + "Height = " + parameters.getPreviewSize().height);
            Log.i(TAG, "最終設(shè)置:PictureSize--With = " + parameters.getPictureSize().width + "Height = " + parameters.getPictureSize().height);

        }

    }

    /*停止預(yù)覽*/
    public void doStopCamera() {
        if (camera != null) {
            camera.setPreviewCallback(null);
            camera.stopPreview();
            isPreview = false;
            mPreviewRate = -1f;
            camera.release();
            ;
            camera = null;

        }
    }

    /*拍照*/
    public void doTakePicture() {
        if (isPreview && (camera != null)) {
            camera.takePicture(mShutterCallback /*或者null*/, null, mJpegPictureCallback);
        }
    }

    /*獲取Camera.Parameters實(shí)例*/
    public Camera.Parameters getCameraParams() {
        if (camera != null) {
            parameters = camera.getParameters();
            return parameters;
        }
        return null;
    }

    /*獲取Camera實(shí)例*/
    public Camera getCameraDevice() {
        return camera;
    }

    /*獲取CameraId*/
    public int getmCameraId() {
        return mCameraId;
    }

    /*自動(dòng)對(duì)焦*/
    Camera.AutoFocusCallback autoFocusCallback = new Camera.AutoFocusCallback() {
        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            if (success)
                Log.e(TAG, "輸出信息-->: 對(duì)焦成功" + success);
            else {
                Log.e(TAG, "輸出信息-->: 對(duì)焦失敗" + success);
                camera.autoFocus(autoFocusCallback);
            }

        }
    };


    /*為了實(shí)現(xiàn)拍照的快門(mén)聲音及拍照保存照片需要下面三個(gè)回調(diào)變量*/
    Camera.ShutterCallback mShutterCallback = new Camera.ShutterCallback()
            //快門(mén)按下的回調(diào),在這里我們可以設(shè)置類(lèi)似播放“咔嚓”聲之類(lèi)的操作莫杈。默認(rèn)的就是咔嚓互例。
    {
        public void onShutter() {
            // TODO Auto-generated method stub
            Log.i(TAG, "myShutterCallback:onShutter...");
        }
    };
    Camera.PictureCallback mRawCallback = new Camera.PictureCallback()
            // 拍攝的未壓縮原數(shù)據(jù)的回調(diào),可以為null
    {

        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            Log.i(TAG, "myRawCallback:onPictureTaken...");

        }
    };
    Camera.PictureCallback mJpegPictureCallback = new Camera.PictureCallback()
            //對(duì)jpeg圖像數(shù)據(jù)的回調(diào),最重要的一個(gè)回調(diào)
    {
        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            Log.i(TAG, "myJpegCallback:onPictureTaken...");
            Bitmap b = null;
            if (null != data) {
                b = BitmapFactory.decodeByteArray(data, 0, data.length);//data是字節(jié)數(shù)據(jù),將其解析成位圖
                camera.stopPreview();
                isPreview = false;
            }
            //保存圖片到sdcard
            if (null != b) {
                //設(shè)置FOCUS_MODE_CONTINUOUS_VIDEO)之后筝闹,myParam.set("rotation", 90)失效敲霍。
                //圖片竟然不能旋轉(zhuǎn)了俊马,故這里要旋轉(zhuǎn)下
                Bitmap rotaBitmap = ImageUtil.getRotateBitmap(b, 90.0f);
                FileUtil.saveBitmap(rotaBitmap);
            }
            //再次進(jìn)入預(yù)覽
            camera.startPreview();
            isPreview = true;
        }
    };

    /*坐標(biāo)轉(zhuǎn)換*/
    public Rect calculateTapArea(float x, float y, float coefficient, Camera.Size previewSize) {
        float focusAreaSize = 300;
        int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();
        int centerX = (int) (x / previewSize.width - 1000);
        int centerY = (int) (y / previewSize.height - 1000);

        int left = clamp(centerX - areaSize / 2, -1000, 1000);
        int top = clamp(centerY - areaSize / 2, -1000, 1000);

        RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);

        return new Rect(Math.round(rectF.left), Math.round(rectF.top), Math.round(rectF.right), Math.round(rectF.bottom));
    }

    public int clamp(int x, int min, int max) {
        if (x > max) {
            return max;
        }
        if (x < min) {
            return min;
        }
        return x;
    }

    /*設(shè)置對(duì)焦區(qū)域*/
    public void doFouce(MotionEvent event, Camera camera) {

        Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1.5f, parameters.getPreviewSize());
        camera.cancelAutoFocus();
        if (parameters.getMaxNumFocusAreas() > 0) {
            List<Camera.Area> fouce = new ArrayList<>();
            fouce.add(new Camera.Area(focusRect, 800));
            parameters.setFocusAreas(fouce);
        } else {
            Log.e(TAG, "輸出信息-->: 不支持測(cè)光");
        }
        final String currentFocusMode = parameters.getFocusMode();
        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO);
        camera.setParameters(parameters);
        camera.autoFocus(new Camera.AutoFocusCallback() {

            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                Camera.Parameters params = camera.getParameters();
                params.setFocusMode(currentFocusMode);
                camera.setParameters(params);
            }
        });


    }

    /*計(jì)算兩指尖距離*/
    public float getFingerSpacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.sqrt(x * x + y * y);
    }
    /*設(shè)置縮放*/
    public void doZoom(boolean isZoomIn,Camera camera){
        if (parameters.isZoomSupported()){
            int  MaxZoom = parameters.getMaxZoom();
            int zoom = parameters.getZoom();
            if (isZoomIn && zoom <MaxZoom){
                zoom++;
            }else if (zoom >0 ){
                zoom--;
            }
            parameters.setZoom(zoom);
            camera.setParameters(parameters);
        }else {
            Log.e(TAG, "輸出信息-->: 縮放失敗" );
        }

    }
}

setUp4 相機(jī)預(yù)覽界面

public class CameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    private static final String TAG = "zhangxin";
    private Context context;
    private SurfaceHolder holder;
    private float oldDist = 1f;
    private FoucsView mFoucsView;


    public CameraSurfaceView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;


        holder = getHolder();
        holder.setFormat(PixelFormat.TRANSPARENT);
        holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
        holder.addCallback(this);


    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        Log.e(TAG, "surfaceCreated: ");
        try {
            CameraInterface.getInstance().doOpenCamera(null, Camera.CameraInfo.CAMERA_FACING_BACK);
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        Log.e(TAG, "surfaceChanged: ");
        try {
            CameraInterface.getInstance().doStartPreview(holder, 1.333f);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e(TAG, "surfaceDestroyed: ");
        CameraInterface.getInstance().doStopCamera();
    }

    public SurfaceHolder getSurfaceHolder() {
        return holder;
    }

    /*手指監(jiān)聽(tīng)*/
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getPointerCount() == 1) {
            CameraInterface.getInstance().doFouce(event,CameraInterface.getInstance().getCameraDevice());
        }else {
            switch (event.getAction() & MotionEvent.ACTION_MASK){
                case MotionEvent.ACTION_POINTER_DOWN:
                    oldDist = CameraInterface.getInstance().getFingerSpacing(event);
                    break;
                case MotionEvent.ACTION_MOVE:
                    float newDist = CameraInterface.getInstance().getFingerSpacing(event);
                        if (newDist > oldDist){
                            CameraInterface.getInstance().doZoom(true,CameraInterface.getInstance().getCameraDevice());
                        }else {
                            CameraInterface.getInstance().doZoom(false,CameraInterface.getInstance().getCameraDevice());
                        }
                    oldDist = newDist;
                    break;
            }
        }
        return true;
    }
}

setUp5 相機(jī)調(diào)用activity

public class CameraActivity extends AppCompatActivity{
    private static final String TAG = "zhangxin";
    float previewRate = -1f;
    @BindView(R.id.camera_surfaceview)
    CameraSurfaceView cameraSurfaceview;
    @BindView(R.id.btn_take_Photo)
    Button btnTakePhoto;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_camera);
        CheckPermissionsUtil checkPermissionsUtil = new CheckPermissionsUtil(this);
        checkPermissionsUtil.requestAllPermission(this);
        ButterKnife.bind(this);
        initViewParams();

    }


    private void initViewParams() {
        ViewGroup.LayoutParams params = cameraSurfaceview.getLayoutParams();
        Point p = DisplayUtil.getScreenMetrics(this);
        params.width = p.x;
        params.height = p.y;
        previewRate = DisplayUtil.getScreenRate(this); //默認(rèn)全屏的比例預(yù)覽
        cameraSurfaceview.setLayoutParams(params);

    }
    @OnClick(R.id.btn_take_Photo)
    public void takePhoto(){
        takePicture();
    }


    private void takePicture() {
        CameraInterface.getInstance().doTakePicture();

    }

    private void switchCamera() {
        int newId = (CameraInterface.getInstance().getmCameraId() + 1) % 2;
        CameraInterface.getInstance().doStopCamera();
        CameraInterface.getInstance().doOpenCamera(null, newId);
        CameraInterface.getInstance().doStartPreview(cameraSurfaceview.getSurfaceHolder(), previewRate);


    }

setUp6 布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.alva.zx.camera.zcamera.CameraSurfaceView
            android:id="@+id/camera_surfaceview"
            android:layout_width="0dip"
            android:layout_height="0dip" />

        <Button
            android:id="@+id/btn_take_Photo"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|center"
            android:text="拍照" />
    </FrameLayout>
</RelativeLayout>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肩杈,隨后出現(xiàn)的幾起案子柴我,更是在濱河造成了極大的恐慌,老刑警劉巖扩然,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艘儒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夫偶,警方通過(guò)查閱死者的電腦和手機(jī)界睁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)兵拢,“玉大人翻斟,你說(shuō)我怎么就攤上這事∷盗澹” “怎么了访惜?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)腻扇。 經(jīng)常有香客問(wèn)我债热,道長(zhǎng),這世上最難降的妖魔是什么幼苛? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任窒篱,我火速辦了婚禮,結(jié)果婚禮上舶沿,老公的妹妹穿的比我還像新娘墙杯。我一直安慰自己,他們只是感情好括荡,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布高镐。 她就那樣靜靜地躺著,像睡著了一般一汽。 火紅的嫁衣襯著肌膚如雪避消。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天召夹,我揣著相機(jī)與錄音岩喷,去河邊找鬼。 笑死监憎,一個(gè)胖子當(dāng)著我的面吹牛纱意,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲸阔,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼偷霉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼迄委!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起类少,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叙身,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后硫狞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體信轿,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年残吩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了财忽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泣侮,死狀恐怖即彪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情活尊,我是刑警寧澤隶校,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站酬凳,受9級(jí)特大地震影響惠况,放射性物質(zhì)發(fā)生泄漏遭庶。R本人自食惡果不足惜宁仔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峦睡。 院中可真熱鬧翎苫,春花似錦、人聲如沸榨了。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)龙屉。三九已至呐粘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間转捕,已是汗流浹背作岖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留五芝,地道東北人痘儡。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像枢步,于是被迫代替她去往敵國(guó)和親沉删。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渐尿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,304評(píng)論 25 707
  • 上一篇介紹了如何使用系統(tǒng)相機(jī)簡(jiǎn)單、快速的進(jìn)行拍照矾瑰,本篇將介紹如何使用框架提供的API直接控制攝像機(jī)硬件砖茸。 你還在為...
    Xiao_Mai閱讀 7,192評(píng)論 4 18
  • 事情就是這樣湊巧。當(dāng)我去芝加哥出差的時(shí)段殴穴,我的英語(yǔ)私教老師正好也去澳大利亞旅行渔彰,算是她的春假節(jié)目。各自出發(fā)前推正,她囑...
    嬌嬌貓閱讀 152評(píng)論 3 8
  • 二叔家的屋梁上懸著一個(gè)黃色的紙包恍涂。半透明的油紙看上去十分陳舊,聽(tīng)二叔說(shuō)這黃紙包可是“傳家寶”植榕。 “紙包...
    迪哥哥閱讀 623評(píng)論 0 5
  • 6.1日客感悟:分權(quán)機(jī)制 ————————— 現(xiàn)已變成負(fù)擔(dān)……每天晚上拖到不能拖為止再沧,必須要改變這種狀態(tài)...
    張琪77閱讀 194評(píng)論 0 1