android7.1的SnapdragonCamera之CameraActivity逻辑流程分析整体
来源:互联网 发布:知乎 女朋友是拉拉 编辑:程序博客网 时间:2024/06/06 00:55
不积跬步无以至千里
“一花一世界,一树一乾坤,一草一天堂,一木一浮生”,这句话告诉我们通过一小部分可以知道整个整体,同样的Camera也一样,本文主要分析这个CameraActivity。
其实我发现AndroidMainfest.xml中,启动Activity就是CameraActivity的别名的CameraLauncher,如下图:
下面看一下这个CameraActivity的整个生命周期(代码的逻辑,我通过加注释给大家解释一下)。
onCreate方法
public void onCreate(Bundle state) { super.onCreate(state); //检查权限,如果权限没检查过,或者没有批准的权限直接关闭。另说一嘴,大家都知道吗?android7.1又对权限做了新的处理。 if (checkPermissions() || !mHasCriticalPermissions) { Log.v(TAG, "onCreate: Missing critical permissions."); //关闭本Activity,即跳出整个程序 finish(); return; } // Check if this is in the secure camera mode.检查是否为安全相机模式 Intent intent = getIntent(); String action = intent.getAction(); if (INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE.equals(action) || ACTION_IMAGE_CAPTURE_SECURE.equals(action) || intent.getComponent().getClassName().equals(GESTURE_CAMERA_NAME)) { mSecureCamera = true; } else { mSecureCamera = intent.getBooleanExtra(SECURE_CAMERA_EXTRA, false); } //根据相机是不是安全相机模式做处理 if (mSecureCamera) { // Change the window flags so that secure camera can show when locked 当被锁住时,为安全模式时,改变窗口。 Window win = getWindow(); WindowManager.LayoutParams params = win.getAttributes(); params.flags |= WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED; if (intent.getComponent().getClassName().equals(GESTURE_CAMERA_NAME)) { params.flags |= WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON; //获取唤醒锁 PowerManager pm = ((PowerManager) getSystemService(POWER_SERVICE)); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock.acquire(); Log.d(TAG, "acquire wake lock"); } win.setAttributes(params); } GcamHelper.init(getContentResolver()); //设置actionBar getWindow().requestFeature(Window.FEATURE_ACTION_BAR); setContentView(R.layout.camera_filmstrip); //为ActionBa设置菜单可见监听 mActionBar = getActionBar(); mActionBar.addOnMenuVisibilityListener(this); //当大于4.3版本,设置窗口的旋转动画 if (ApiHelper.HAS_ROTATION_ANIMATION) { setRotationAnimation(); } //声明一个主线程的Handler,主要用于ActionBar的隐藏和显示 mMainHandler = new MainHandler(getMainLooper()); //关联控件 mAboveFilmstripControlLayout = (FrameLayout) findViewById(R.id.camera_above_filmstrip_layout); mAboveFilmstripControlLayout。setFitsSystemWindows(true);mAboveFilmstripControlLayout。setFitsSystemWindows(true);this.setSystemBarsVisibility(false); mPanoramaManager = AppManagerFactory.getInstance(this) 。getPanoramaStitchingManager(); mPlaceholderManager = AppManagerFactory.getInstance(this) 。getGcamProcessingManager(); //添加图片加载监听 mPanoramaManager。addTaskListener(mStitchingListener); mPlaceholderManager。addTaskListener(mPlaceholderListener); LayoutInflater inflater = getLayoutInflater(); View rootLayout = inflater。inflate(R。layout。camera, null, false); mCameraRootFrame = (FrameLayout)rootLayout。findViewById(R。id。camera_root_frame); mCameraPhotoModuleRootView = rootLayout。findViewById(R。id。camera_photo_root); mCameraVideoModuleRootView = rootLayout。findViewById(R。id。camera_video_root); mCameraPanoModuleRootView = rootLayout。findViewById(R。id。camera_pano_root); mPanoStitchingPanel = findViewById(R。id。pano_stitching_progress_panel); mBottomProgress = (ProgressBar) findViewById(R。id。pano_stitching_progress_bar); mCameraPreviewData = new CameraPreviewData(rootLayout, FilmStripView。ImageData。SIZE_FULL, FilmStripView。ImageData。SIZE_FULL); // Put a CameraPreviewData at the first position mWrappedDataAdapter = new FixedFirstDataAdapter( new CameraDataAdapter(new ColorDrawable( getResources()。getColor(R。color.photo_placeholder))), mCameraPreviewData); mFilmStripView = (FilmStripView) findViewById(R。id.filmstrip_view); mFilmStripView。setViewGap( getResources()。getDimensionPixelSize(R。dimen.camera_film_strip_gap)); mPanoramaViewHelper = new PanoramaViewHelper(this); mPanoramaViewHelper。onCreate(); mFilmStripView。setPanoramaViewHelper(mPanoramaViewHelper); // Set up the camera preview first so the preview shows up ASAP mFilmStripView。setListener(mFilmStripListener); //获取当前的拍照模式:视频、照相 int moduleIndex = -1; if (MediaStore。INTENT_ACTION_VIDEO_CAMERA。equals(getIntent()。getAction()) || MediaStore。ACTION_VIDEO_CAPTURE。equals(getIntent()。getAction())) { moduleIndex = ModuleSwitcher。VIDEO_MODULE_INDEX; } else if (MediaStore。INTENT_ACTION_STILL_IMAGE_CAMERA.equals(getIntent()。getAction()) || MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA_SECURE。equals(getIntent() 。getAction())) { moduleIndex = ModuleSwitcher。PHOTO_MODULE_INDEX; SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); if (prefs.getInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, -1) == ModuleSwitcher.GCAM_MODULE_INDEX && GcamHelper.hasGcamCapture()) { moduleIndex = ModuleSwitcher.GCAM_MODULE_INDEX; } } else if (MediaStore.ACTION_IMAGE_CAPTURE.equals(getIntent().getAction()) || MediaStore.ACTION_IMAGE_CAPTURE_SECURE.equals(getIntent().getAction())) { moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX; } else { // If the activity has not been started using an explicit intent, // read the module index from the last time the user changed modes SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); moduleIndex = prefs.getInt(CameraSettings.KEY_STARTUP_MODULE_INDEX, -1); if ((moduleIndex == ModuleSwitcher.GCAM_MODULE_INDEX && !GcamHelper.hasGcamCapture()) || moduleIndex < 0) { moduleIndex = ModuleSwitcher.PHOTO_MODULE_INDEX; } } //设置重力感应监听 mOrientationListener = new MyOrientationEventListener(this); //根据上面获取、判断的模式,去设置界面的显示等等。 setModuleFromIndex(moduleIndex); //根据是不是安全相机来处理if (!mSecureCamera) { mDataAdapter = mWrappedDataAdapter; mFilmStripView。setDataAdapter(mDataAdapter); if (!isCaptureIntent()) { mDataAdapter。requestLoad(getContentResolver()); mDataRequested = true; } } else { // Put a lock placeholder as the last image by setting its date to // 0. //点击照片跳转意图 ImageView v = (ImageView) getLayoutInflater().inflate( R.layout.secure_album_placeholder, null); v.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { try { UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_GALLERY, null); //跳转到相册 startActivity(IntentHelper.getGalleryIntent(CameraActivity.this)); } catch (ActivityNotFoundException e) { Log.w(TAG, "Failed to launch gallery activity, closing"); } finish(); } }); mDataAdapter = new FixedLastDataAdapter( mWrappedDataAdapter, new SimpleViewData( v, v.getDrawable().getIntrinsicWidth(), v.getDrawable().getIntrinsicHeight(), 0, 0)); // Flush out all the original data. mDataAdapter.flush(); mFilmStripView.setDataAdapter(mDataAdapter); } //设置nfc setupNfcBeamPush(); //设置观察者,来分别观察图片的变化和视频资源的变化 mLocalImagesObserver = new LocalMediaObserver(); mLocalVideosObserver = new LocalMediaObserver(); getContentResolver().registerContentObserver( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mLocalImagesObserver); getContentResolver().registerContentObserver( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, mLocalVideosObserver); SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); mDeveloperMenuEnabled = prefs.getBoolean(CameraSettings.KEY_DEVELOPER_MENU, false); //设置窗口大小 Display display = getWindowManager().getDefaultDisplay(); Point size = new Point(); display.getSize(size); int width = size.x; int height = size.y; int lower = Math.min(width, height); int offset = lower * 10 / 100; SETTING_LIST_WIDTH_1 = lower / 2 + offset; SETTING_LIST_WIDTH_2 = lower / 2 - offset; //注册关于sd的挂载的广播 registerSDcardMountedReceiver(); }
onStart方法:
@Override public void onStart() { super.onStart(); //开启添加图片、视频的service bindMediaSaveService(); mPanoramaViewHelper.onStart(); }
onResume方法:
@Override public void onResume() { //权限检测 if (checkPermissions() || !mHasCriticalPermissions) { super。onResume(); Log.v(TAG, "onResume: Missing critical permissions."); finish(); return; } UsageStatistics.onEvent(UsageStatistics.COMPONENT_CAMERA, UsageStatistics.ACTION_FOREGROUNDED, this.getClass().getSimpleName()); mOrientationListener.enable(); mCurrentModule.onResumeBeforeSuper(); super.onResume(); mCurrentModule.onResumeAfterSuper(); //设置预览画面能否滑动 setSwipingEnabled(true); if (mResetToPreviewOnResume) { // Go to the preview on resume. mFilmStripView.getController().goToFirstItem(); } // Default is showing the preview, unless disabled by explicitly // starting an activity we want to return from to the filmstrip rather // than the preview. mResetToPreviewOnResume = true; //查看图片和视频资源有无变化,有则重新加载 if (mLocalVideosObserver.isMediaDataChangedDuringPause() || mLocalImagesObserver.isMediaDataChangedDuringPause()) { if (!mSecureCamera) { // If it's secure camera, requestLoad() should not be called // as it will load all the data. mDataAdapter.requestLoad(getContentResolver()); mThumbnailDrawable = null; } } //重置观察者标志位 mLocalImagesObserver.setActivityPaused(false); mLocalVideosObserver.setActivityPaused(false); //This is a temporal solution to share LED resource //as Android doesn’t have any default intent to share the state. // if the led flash light is open, turn it off Log.d(TAG, "send the turn off Flashlight broadcast"); //关闭闪光灯 Intent intent = new Intent("org.codeaurora.snapcam.action.CLOSE_FLASHLIGHT"); intent.putExtra("camera_led", true); sendBroadcast(intent); }
onPause方法:
@Override public void onPause() { // Delete photos that are pending deletion //删除照片时正好界面pause了的处理 performDeletion(); //关闭重力传感器监听 mOrientationListener.disable(); mCurrentModule.onPauseBeforeSuper(); super.onPause(); mCurrentModule.onPauseAfterSuper(); //设置观察者的标志位 mLocalImagesObserver.setActivityPaused(true); mLocalVideosObserver.setActivityPaused(true); }
onStop方法:
@Override protected void onStop() { super.onStop(); mPanoramaViewHelper.onStop(); //断开存储视频、图片的service unbindMediaSaveService(); }
onDestory方法:
@Override public void onDestroy() { //释放唤醒锁 if (mWakeLock != null && mWakeLock.isHeld()) { mWakeLock.release(); Log.d(TAG, "wake lock release"); } //注销观察者和sd卡的挂载广播 if (mLocalImagesObserver != null) { getContentResolver().unregisterContentObserver(mLocalImagesObserver); getContentResolver().unregisterContentObserver(mLocalVideosObserver); unregisterReceiver(mSDcardMountedReceiver); } super.onDestroy(); }
先分析到这,接下在再补充。。。
阅读全文
0 0
- android7.1的SnapdragonCamera之CameraActivity逻辑流程分析整体
- Android7.0 Vold 进程工作机制分析之整体流程
- Android7.0 Vold 进程工作机制分析之整体流程
- [Android7.0]开启NFC的流程分析
- [Android7.0]NFC初始化的流程分析
- 机房收费文档之流程整体分析
- HDFS源码分析DataXceiver之整体流程
- 手势识别的整体流程分析
- Android7.0关机流程分析
- Android7.0 startService流程分析
- Android7.0关机流程分析
- android7.0拨号流程分析
- android7.0之系统应用Gallery2整体分析以及开始过程
- RxJava2_整体流程分析
- 文本挖掘之详细整体的流程
- netts之 CTWSocket代码流程分析(整体是客户端请求式的)
- HBase的scan源码分析客户端部分之整体流程(一)
- fabric0.6的账本操作的整体流程分析
- Ubuntu用rdesktop连接windows服务器并传输文件
- JavaScript作用域和闭包
- busybox telnetd: can't find free pty
- 30行JavaScript代码,教你分分钟创建神经网络
- 文本外观属性
- android7.1的SnapdragonCamera之CameraActivity逻辑流程分析整体
- 拷贝构造函数什么时候调用?
- 自适应的响应式的区别
- POJ
- CC26XX的RTOS定时器任务的建立。
- 多线程四.三-------不同锁的功能和使用
- Mybatis 框架使用的最核心内容(一):Mybatis的特点和映射管理
- h2o.ai源码解析(2)—启动流程
- 超级强大的SVG SMIL animation动画详解