public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback, View.OnClickListener,
Camera.PictureCallback, Camera.PreviewCallback, Camera.AutoFocusCallback
{
private Camera camera;
private SurfaceHolder surfaceHolder;
private SurfaceView preview;
private Button shotBtn;
protected void onCreate(Bundle savedInstanceState, LayoutInflater inflater, ViewGroup container)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
preview = (SurfaceView) findViewById(R.id.SurfaceView01);
surfaceHolder = preview.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
shotBtn = (Button) findViewById(R.id.Button01);
shotBtn.setText("Shot");
shotBtn.setOnClickListener(this);
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
try
{
camera.setPreviewDisplay(holder);
camera.setPreviewCallback(this);
}
catch (IOException e)
{
e.printStackTrace();
}
Camera.Size previewSize = camera.getParameters().getPreviewSize();
float aspect = (float) previewSize.width / previewSize.height;
int previewSurfaceWidth = preview.getWidth();
int previewSurfaceHeight = preview.getHeight();
ViewGroup.LayoutParams lp = preview.getLayoutParams();
// здесь корректируем размер отображаемого preview, чтобы не было искажений
if (this.getResources().getConfiguration().orientation != Configuration.ORIENTATION_LANDSCAPE)
{
// портретный вид
camera.setDisplayOrientation(90);
lp.height = previewSurfaceHeight;
lp.width = (int) (previewSurfaceHeight / aspect);
;
}
else
{
// ландшафтный
camera.setDisplayOrientation(0);
lp.width = previewSurfaceWidth;
lp.height = (int) (previewSurfaceWidth / aspect);
}
preview.setLayoutParams(lp);
camera.startPreview();
}
@Override
protected void onResume()
{
super.onResume();
camera = Camera.open();
}
@Override
protected void onPause()
{
super.onPause();
if (camera != null)
{
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
}
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
}
@Override
public void onClick(View v)
{
if (v == shotBtn)
{
// либо делаем снимок непосредственно здесь
// либо включаем обработчик автофокуса
//camera.takePicture(null, null, null, this);
camera.autoFocus(this);
}
}
@Override
public void onPictureTaken(byte[] paramArrayOfByte, Camera camera)
{
try
{
File saveDir = new File("/sdcard/CameraExample/");
if (!saveDir.exists())
{
saveDir.mkdirs();
}
FileOutputStream os = new FileOutputStream(String.format("/sdcard/CameraExample/%d.jpg", System.currentTimeMillis()));
os.write(paramArrayOfByte);
os.close();
}
catch (Exception e)
{
}
// после того, как снимок сделан, показ превью отключается. необходимо включить его
camera.startPreview();
}
@Override
public void onPreviewFrame(byte[] data, Camera camera)
{
}
@Override
public void onAutoFocus(boolean success, Camera camera)
{
if (success)
{
// если удалось сфокусироваться, делаем снимок
camera.takePicture(null, null, null, this);
}
}
}
МАНИФЕСТ:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest>
АКТИВИТИ:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
android:id="@+id/FrameLayout01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<SurfaceView
android:id="@+id/SurfaceView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</SurfaceView>
<Button
android:id="@+id/Button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@+id/Button01">
</Button>
</FrameLayout>
Проблема в том, что в onPause
вы ставите camera = null;
, а потом в onResume
пытаетесь открыть camera = Camera.open();
Естественно, оно падает.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Когда я переопределяю метод из базового класса с помощью @Override - это статическое связывание, а когда без - динамическоеПравильно ли я понимаю?
У меня есть файл, в котором лежит строка, где каждое значение разделено пробелом, мне надо разделить каждое значение через пробелВ файле строка...
У меня есть небольшое web-приложение с использованием JSОна лежит локально и должно точно так же использоваться локально
помогите осуществить такой механизмНашел вот такой пример jsfiddle