You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
198 lines
5.2 KiB
198 lines
5.2 KiB
/*
|
|
* UVCCamera
|
|
* library and sample to access to UVC web camera on non-rooted Android device
|
|
*
|
|
* Copyright (c) 2014-2017 saki t_saki@serenegiant.com
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
* All files in the folder are under this Apache License, Version 2.0.
|
|
* Files in the libjpeg-turbo, libusb, libuvc, rapidjson folder
|
|
* may have a different license, see the respective files.
|
|
*/
|
|
|
|
package com.jiangdg.usbcamera.view;
|
|
|
|
import android.Manifest;
|
|
import android.annotation.SuppressLint;
|
|
import android.app.Activity;
|
|
import android.content.pm.PackageManager;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.Looper;
|
|
import android.support.annotation.NonNull;
|
|
import android.support.annotation.StringRes;
|
|
import android.support.v7.app.AppCompatActivity;
|
|
import android.util.Log;
|
|
import android.widget.Toast;
|
|
|
|
import com.serenegiant.dialog.MessageDialogFragment;
|
|
import com.serenegiant.utils.BuildCheck;
|
|
import com.serenegiant.utils.HandlerThreadHandler;
|
|
import com.serenegiant.utils.PermissionCheck;
|
|
|
|
/**
|
|
* Created by saki on 2016/11/18.
|
|
*
|
|
*/
|
|
public class BaseActivity extends AppCompatActivity {
|
|
|
|
private static boolean DEBUG = false;
|
|
private static final String TAG = BaseActivity.class.getSimpleName();
|
|
|
|
// 处理UI的Handler
|
|
private final Handler mUIHandler = new Handler(Looper.getMainLooper());
|
|
private final Thread mUiThread = mUIHandler.getLooper().getThread();
|
|
// 工作线程Handler
|
|
private Handler mWorkerHandler;
|
|
private long mWorkerThreadID = -1;
|
|
|
|
@Override
|
|
protected void onCreate(final Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
// 创建工作线程
|
|
if (mWorkerHandler == null) {
|
|
mWorkerHandler = HandlerThreadHandler.createHandler(TAG);
|
|
mWorkerThreadID = mWorkerHandler.getLooper().getThread().getId();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onPause() {
|
|
clearToast();
|
|
super.onPause();
|
|
}
|
|
|
|
@Override
|
|
protected synchronized void onDestroy() {
|
|
// 释放线程资源
|
|
if (mWorkerHandler != null) {
|
|
try {
|
|
mWorkerHandler.getLooper().quit();
|
|
} catch (final Exception e) {
|
|
//
|
|
}
|
|
mWorkerHandler = null;
|
|
}
|
|
super.onDestroy();
|
|
}
|
|
|
|
//================================================================================
|
|
/**
|
|
*
|
|
* 子线程中更新UI,duration为延迟多久执行
|
|
*
|
|
*/
|
|
public final void runOnUiThread(final Runnable task, final long duration) {
|
|
if (task == null) return;
|
|
mUIHandler.removeCallbacks(task);
|
|
if ((duration > 0) || Thread.currentThread() != mUiThread) {
|
|
mUIHandler.postDelayed(task, duration);
|
|
} else {
|
|
try {
|
|
task.run();
|
|
} catch (final Exception e) {
|
|
Log.w(TAG, e);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 移除更新UI task
|
|
* @param task
|
|
*/
|
|
public final void removeFromUiThread(final Runnable task) {
|
|
if (task == null) return;
|
|
mUIHandler.removeCallbacks(task);
|
|
}
|
|
|
|
/**
|
|
* 工作子线程中执行的任务
|
|
*/
|
|
protected final synchronized void queueEvent(final Runnable task, final long delayMillis) {
|
|
if ((task == null) || (mWorkerHandler == null)) return;
|
|
try {
|
|
mWorkerHandler.removeCallbacks(task);
|
|
if (delayMillis > 0) {
|
|
mWorkerHandler.postDelayed(task, delayMillis);
|
|
} else if (mWorkerThreadID == Thread.currentThread().getId()) {
|
|
task.run();
|
|
} else {
|
|
mWorkerHandler.post(task);
|
|
}
|
|
} catch (final Exception e) {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
protected final synchronized void removeEvent(final Runnable task) {
|
|
if (task == null) return;
|
|
try {
|
|
mWorkerHandler.removeCallbacks(task);
|
|
} catch (final Exception e) {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
//================================================================================
|
|
private Toast mToast;
|
|
|
|
protected void showToast(@StringRes final int msg, final Object... args) {
|
|
removeFromUiThread(mShowToastTask);
|
|
mShowToastTask = new ShowToastTask(msg, args);
|
|
runOnUiThread(mShowToastTask, 0);
|
|
}
|
|
|
|
|
|
protected void clearToast() {
|
|
removeFromUiThread(mShowToastTask);
|
|
mShowToastTask = null;
|
|
try {
|
|
if (mToast != null) {
|
|
mToast.cancel();
|
|
mToast = null;
|
|
}
|
|
} catch (final Exception e) {
|
|
// ignore
|
|
}
|
|
}
|
|
|
|
private ShowToastTask mShowToastTask;
|
|
private final class ShowToastTask implements Runnable {
|
|
final int msg;
|
|
final Object args;
|
|
private ShowToastTask(@StringRes final int msg, final Object... args) {
|
|
this.msg = msg;
|
|
this.args = args;
|
|
}
|
|
|
|
@Override
|
|
public void run() {
|
|
try {
|
|
if (mToast != null) {
|
|
mToast.cancel();
|
|
mToast = null;
|
|
}
|
|
if (args != null) {
|
|
final String _msg = getString(msg, args);
|
|
mToast = Toast.makeText(BaseActivity.this, _msg, Toast.LENGTH_SHORT);
|
|
} else {
|
|
mToast = Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_SHORT);
|
|
}
|
|
mToast.show();
|
|
} catch (final Exception e) {
|
|
// ignore
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|