android camera 录像拍照停止过程
-、camera 框架分析:1、getIntent().getAction();执行那个api?2、三点指示的xml文件:Indicators.xml (res\layout-land)3、显示内容及指示器区域:Mode_options_overlay.xml (res\layout)2016/5/274、侧滑模式图标显示布局:Arrays.xml (res\values)3335...
-、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() {}
更多推荐
所有评论(0)