-、camera 框架分析:
1、getIntent().getAction();执行那个api?
2、三点指示的xml文件:Indicators.xml (res\layout-land)
3、显示内容及指示器区域:Mode_options_overlay.xml (res\layout) 2016/5/27
4、侧滑模式图标显示布局:
Arrays.xml (res\values) 33352 2016/6/22

@drawable/ic_camera_normal
@drawable/ic_video_normal
@drawable/ic_refocus_normal
@drawable/ic_photosphere_normal
@drawable/ic_panorama_normal
@drawable/ic_camera_normal

ModeListView.java (src\com\android\camera\ui) 84459 2016/5/27
private void initializeModeSelectorItems() {
selectorItem.setImageResource(CameraUtil.getCameraModeIconResId(modeId, getContext()));
// Set text
selectorItem.setText(CameraUtil.getCameraModeText(modeId, getContext()));
}
5、底部bottombar布局:
packages\apps\Camera2\res\layout\bottom_bar_contents.xml
6、在video模式下,在显示界面旋转的图标是怎么实现的?–rotate_arrows.png
public class VideoRecordingHints extends View {
public VideoRecordingHints(){}
public void onLayout(){}
public void draw(){}
}
7、底部bottombar点击按钮颜色渐变怎么去掉的?在bottombar.java中的构造方法中会调用以下资源,
在integers.xml修改bottom_bar_background_alpha_overlay和bottom_bar_background_alpha值。
mBackgroundAlphaOverlay = getResources()
.getInteger(R.integer.bottom_bar_background_alpha_overlay);
mBackgroundAlphaDefault = getResources()
.getInteger(R.integer.bottom_bar_background_alpha);

8、相片&&视频数据库监听?
9、设置底部bottombar按钮背景大小设置:
以下:bottom_bar_contents.xml 把 layout_width及layout_height赋值改为wrap_content
<com.android.camera.ShutterButton
android:id="@+id/shutter_button"
android:layout_width=“match_parent”
android:layout_height=“match_parent”
android:layout_gravity=“center”
android:scaleType=“center”
android:clickable=“true”
android:contentDescription="@string/accessibility_shutter_button"
android:focusable=“true”
android:src="@drawable/ic_camera"
android:background="@null"
/>
10、缩略图加载工具:thumbnaiUtils.java 修改的地方–展讯CameraActivity.java 底部添加快捷方法,当为视频格式时,
用到ThumbnailUtils:如
private Bitmap getLastVideoThumbnail(String videoPath, int kind) {
return ThumbnailUtils.createVideoThumbnail(videoPath, kind);
//return LocalDataUtil.loadVideoThumbnail(videoPath);
}
11、点击三点指示器展示图片列表:
IndicatorIconController.java (src\com\android\camera\widget) 15169 2016/11/23
Mode_options.xml (res\layout-land) 6413 2016/11/24
切换动漫显示:ModeOptions.java (src\com\android\camera\widget) 13727 2016/11/23

12、当拍完照片或者视频时,会调用notifyNewMedia(uri)在右侧弹出一个窗口且通知bottombar底部的快捷按钮图片进行更新。
AppController.java (src\com\android\camera\app): public void notifyNewMedia(Uri uri);
CameraActivity.java (src\com\android\camera): public void notifyNewMedia(final Uri uri) {
CameraActivity.java (src\com\android\camera): Log.i(TAG,“notifyNewMedia end” );
CaptureModule.java (src\com\android\camera): mAppController.notifyNewMedia(uri);
FreezeFrameDisplayControl.java (src\com\sprd\camera\freeze): // SPRD: NotifyNewMedia when select save the freeze display picture
FreezeFrameDisplayControl.java (src\com\sprd\camera\freeze): mActivity.notifyNewMedia(mUri);
PhotoModule.java (src\com\android\camera): mActivity.notifyNewMedia(uri);
TinyPlanetFragment.java (src\com\android\camera\tinyplanet): activity.notifyNewMedia(uri);
VideoModule.java (src\com\android\camera): mActivity.notifyNewMedia(uri);
VideoModule.java (src\com\android\camera): mActivity.notifyNewMedia(uri);
WideAnglePanoramaModule.java (src\com\sprd\camera\panora):
private final MediaSaver.OnMediaSavedListener mOnVideoSavedListener =
new MediaSaver.OnMediaSavedListener() {
@Override
public void onMediaSaved(Uri uri) {
if (uri != null) {
Log.i(TAG, “Video file onMediaSaved!”);
mCurrentVideoUri = uri;
mCurrentVideoUriFromMediaSaved = true;
onVideoSaved();
mActivity.notifyNewMedia(uri);
}
}
};

获取uri信息:
MediaSaverImpl.java (src\com\android\camera)
13、移除浏览界面图片数据的操作
15、浏览图片界面,
16、滑动打开或关闭图片幻灯片:CameraActivity.java
public void onFilmstripShown() {}
public void onFilmstripHidden() {}
17、向左滑动时,modelistview选择模式,显示和隐藏bottombar和preview:Modelistview.java
private abstract class ModeListState implements GestureDetector.OnGestureListener {}
private class FullyHiddenState extends ModeListState {}
private class FullyShownState extends ModeListState {}
private class ShimmyState extends ModeListState {}
private class ScrollingState extends ModeListState {}

18、点击bottombar底部快捷按钮跳转到浏览界面或者打开galley;
@OnClickAttr
public void onPreviewThumbClicked(View v) {
mCameraAppUI.showFilmstrip();
}
跳转到galley界面:
Intent intent = new Intent(Intent.ACTION_MAIN); //
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//intent.setAction("");
//intent.setClassName(“com.android.camera2”, “com.android.camera.CameraLauncher”);
intent.setClassName(“com.android.gallery3d”, “com.android.gallery3d.app.GalleryActivity”);
mAppContext.startActivity(intent);
19、浏览页面打开gallery的button: //代码是通过IntentHelper.java 意图获取gallery应用获取图标。 未知道按钮点击的事件。
cameraActivity.Java
public boolean onCreateOptionsMenu(Menu menu) {}
20、浏览器图片删除:log日志
I/( 1811): at com.android.camera.CameraActivity.removeData(CameraActivity.java:1343)
I/( 1811): at com.android.camera.CameraActivity.access$4100(CameraActivity.java:168)
I/( 1811): at com.android.camera.CameraActivity 26. o n C l i c k ( C a m e r a A c t i v i t y . j a v a : 3131 ) I / ( 1811 ) : a t c o m . a n d r o i d . i n t e r n a l . a p p . A l e r t C o n t r o l l e r 26.onClick(CameraActivity.java:3131) I/( 1811): at com.android.internal.app.AlertController 26.onClick(CameraActivity.java:3131)I/(1811):atcom.android.internal.app.AlertControllerButtonHandler.handleMessage(AlertController.java:165)
I/( 1811): at android.os.Handler.dispatchMessage(Handler.java:102)

在这里插入图片描述
亮度:
onModeListOpenProgress
亮度值获取
onModeListOpenRatioUpdate
打开侧滑的引用
class ShimmyState extends ModeListState
打开时亮度为正常亮度
onModeListOpenRatioUpdate(0);
手势侧滑时亮度的改变
onVisibleWidthChanged

18、视频模式与拍照模式下的bottombar背景颜色不一样。

二、执行过程
1、videomodle模式执行过程:首先切换模式,显示布局,点击拍照按钮,开始录制,停止录制,保存数据。
a、切换模式初始化过程:
I/( 2748): java.lang.Throwable
I/( 2748): at com.android.camera.VideoModule.init(VideoModule.java:353)
I/( 2748): at com.android.camera.CameraActivity.openModule(CameraActivity.java:2580)
I/( 2748): at com.android.camera.CameraActivity.onModeSelected(CameraActivity.java:2378)
I/( 2748): at com.android.camera.app.CameraAppUI.onModeSelected(CameraAppUI.java:1475)
I/( 2748): at com.android.camera.ui.ModeListView.onModeSelected(ModeListView.java:1275)
I/( 2748): at com.android.camera.ui.ModeListView.access 4700 ( M o d e L i s t V i e w . j a v a : 64 ) I / ( 2748 ) : a t c o m . a n d r o i d . c a m e r a . u i . M o d e L i s t V i e w 4700(ModeListView.java:64) I/( 2748): at com.android.camera.ui.ModeListView 4700(ModeListView.java:64)I/(2748):atcom.android.camera.ui.ModeListViewPeepholeAnimationEffect$8 1. r u n ( M o d e L i s t V i e w . j a v a : 2178 ) I / ( 2748 ) : a t a n d r o i d . o s . H a n d l e r . h a n d l e C a l l b a c k ( H a n d l e r . j a v a : 739 ) I / ( 2748 ) : a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 95 ) I / ( 2748 ) : a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 135 ) I / ( 2748 ) : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 5354 ) I / ( 2748 ) : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) I / ( 2748 ) : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 372 ) I / ( 2748 ) : a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t 1.run(ModeListView.java:2178) I/( 2748): at android.os.Handler.handleCallback(Handler.java:739) I/( 2748): at android.os.Handler.dispatchMessage(Handler.java:95) I/( 2748): at android.os.Looper.loop(Looper.java:135) I/( 2748): at android.app.ActivityThread.main(ActivityThread.java:5354) I/( 2748): at java.lang.reflect.Method.invoke(Native Method) I/( 2748): at java.lang.reflect.Method.invoke(Method.java:372) I/( 2748): at com.android.internal.os.ZygoteInit 1.run(ModeListView.java:2178)I/(2748):atandroid.os.Handler.handleCallback(Handler.java:739)I/(2748):atandroid.os.Handler.dispatchMessage(Handler.java:95)I/(2748):atandroid.os.Looper.loop(Looper.java:135)I/(2748):atandroid.app.ActivityThread.main(ActivityThread.java:5354)I/(2748):atjava.lang.reflect.Method.invoke(NativeMethod)I/(2748):atjava.lang.reflect.Method.invoke(Method.java:372)I/(2748):atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:947)
I/( 2748): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

b、点击按钮开始录像
I/( 2521): at com.android.camera.VideoModule.startVideoRecording(VideoModule.java:1469)
I/( 2521): at com.android.camera.VideoModule.onShutterButtonClick(VideoModule.java:781)
I/( 2521): at com.android.camera.ShutterButton.performClick(ShutterButton.java:161)
I/( 2521): at android.view.View P e r f o r m C l i c k . r u n ( V i e w . j a v a : 19881 ) I / ( 2521 ) : a t a n d r o i d . o s . H a n d l e r . h a n d l e C a l l b a c k ( H a n d l e r . j a v a : 739 ) I / ( 2521 ) : a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 95 ) I / ( 2521 ) : a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 135 ) I / ( 2521 ) : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 5354 ) I / ( 2521 ) : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) I / ( 2521 ) : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 372 ) I / ( 2521 ) : a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t PerformClick.run(View.java:19881) I/( 2521): at android.os.Handler.handleCallback(Handler.java:739) I/( 2521): at android.os.Handler.dispatchMessage(Handler.java:95) I/( 2521): at android.os.Looper.loop(Looper.java:135) I/( 2521): at android.app.ActivityThread.main(ActivityThread.java:5354) I/( 2521): at java.lang.reflect.Method.invoke(Native Method) I/( 2521): at java.lang.reflect.Method.invoke(Method.java:372) I/( 2521): at com.android.internal.os.ZygoteInit PerformClick.run(View.java:19881)I/(2521):atandroid.os.Handler.handleCallback(Handler.java:739)I/(2521):atandroid.os.Handler.dispatchMessage(Handler.java:95)I/(2521):atandroid.os.Looper.loop(Looper.java:135)I/(2521):atandroid.app.ActivityThread.main(ActivityThread.java:5354)I/(2521):atjava.lang.reflect.Method.invoke(NativeMethod)I/(2521):atjava.lang.reflect.Method.invoke(Method.java:372)I/(2521):atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:947)
I/( 2521): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

c、停止录像:
I/( 2521): at com.android.camera.VideoModule.stopVideoRecording(VideoModule.java:1591)
I/( 2521): at com.android.camera.VideoModule.onStopVideoRecording(VideoModule.java:694)
I/( 2521): at com.android.camera.VideoModule.onShutterButtonClick(VideoModule.java:743)
I/( 2521): at com.android.camera.ShutterButton.performClick(ShutterButton.java:161)
I/( 2521): at android.view.View P e r f o r m C l i c k . r u n ( V i e w . j a v a : 19881 ) I / ( 2521 ) : a t a n d r o i d . o s . H a n d l e r . h a n d l e C a l l b a c k ( H a n d l e r . j a v a : 739 ) I / ( 2521 ) : a t a n d r o i d . o s . H a n d l e r . d i s p a t c h M e s s a g e ( H a n d l e r . j a v a : 95 ) I / ( 2521 ) : a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 135 ) I / ( 2521 ) : a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 5354 ) I / ( 2521 ) : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) I / ( 2521 ) : a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( M e t h o d . j a v a : 372 ) I / ( 2521 ) : a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t PerformClick.run(View.java:19881) I/( 2521): at android.os.Handler.handleCallback(Handler.java:739) I/( 2521): at android.os.Handler.dispatchMessage(Handler.java:95) I/( 2521): at android.os.Looper.loop(Looper.java:135) I/( 2521): at android.app.ActivityThread.main(ActivityThread.java:5354) I/( 2521): at java.lang.reflect.Method.invoke(Native Method) I/( 2521): at java.lang.reflect.Method.invoke(Method.java:372) I/( 2521): at com.android.internal.os.ZygoteInit PerformClick.run(View.java:19881)I/(2521):atandroid.os.Handler.handleCallback(Handler.java:739)I/(2521):atandroid.os.Handler.dispatchMessage(Handler.java:95)I/(2521):atandroid.os.Looper.loop(Looper.java:135)I/(2521):atandroid.app.ActivityThread.main(ActivityThread.java:5354)I/(2521):atjava.lang.reflect.Method.invoke(NativeMethod)I/(2521):atjava.lang.reflect.Method.invoke(Method.java:372)I/(2521):atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:947)
I/( 2521): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:742)

b.录像数据存储路径获取:
videoModule.java
private void generateVideoFilename(int outputFileFormat) {

String path = storageUtil.getFileDir() + ‘/’ + filename;

}
storageUtil.java
public String getFileDir() {}
在这里插入图片描述

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐