Skip to content

Commit

Permalink
supporting Android9.0 and fixing capture image failed
Browse files Browse the repository at this point in the history
  • Loading branch information
jiangdongguo committed Jun 17, 2019
1 parent 27f682a commit 9092e8c
Show file tree
Hide file tree
Showing 11 changed files with 114 additions and 91 deletions.
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,10 @@
package="com.jiangdg.usbcamera">

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

<uses-feature android:name="android.hardware.usb.host"/>

<application
android:name=".application.MyApplication"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,13 +13,12 @@
public class MyApplication extends Application {
private CrashHandler mCrashHandler;
// File Directory in sd card
public static final String DIRECTORY_NAME = "UVCCamera";
public static final String DIRECTORY_NAME = "USBCamera";

@Override
public void onCreate() {
super.onCreate();
mCrashHandler = CrashHandler.getInstance();
mCrashHandler.init(getApplicationContext(), getClass());

}
}
69 changes: 18 additions & 51 deletions app/src/main/java/com/jiangdg/usbcamera/utils/CrashHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@
import java.util.Map;

/**
* UncaughtException处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告.
* UncaughtException handler class
*
* @author user
* @author jiangdg on 2017/6/27.
*
*/
public class CrashHandler implements UncaughtExceptionHandler {
Expand All @@ -33,45 +33,33 @@ public class CrashHandler implements UncaughtExceptionHandler {

public static final String PROGRAM_BROKEN_ACTION = "com.teligen.wccp.PROGRAM_BROKEN";

// 系统默认的UncaughtException处理类
private UncaughtExceptionHandler mDefaultHandler;
// CrashHandler实例
private static CrashHandler instance = new CrashHandler();
// 程序的Context对象
private Context mContext;
// 程序的主Activity的class
private Class<?> mainActivityClass;
// 用来存储设备信息和异常信息
private Map<String, String> infos = new HashMap<String, String>();

/** 保证只有一个CrashHandler实例 */

private CrashHandler() {
}

/** 获取CrashHandler实例 ,单例模式 */
public static CrashHandler getInstance() {
return instance;
}

public void init(Context context, Class<?> activityClass) {
mContext = context;
this.setMainActivityClass(activityClass);
// 获取系统默认的UncaughtException处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
// 设置该CrashHandler为程序的默认处理器
Thread.setDefaultUncaughtExceptionHandler(this);
}

/**
* 当UncaughtException发生时会转入该函数来处理
*/

@Override
public void uncaughtException(Thread thread, Throwable ex) {
if (!handleException(ex) && mDefaultHandler != null) {
// 如果用户没有处理则让系统默认的异常处理器来处理
mDefaultHandler.uncaughtException(thread, ex);
} else {
//重启应用,释放资源
System.out.println("uncaughtException--->" + ex.getMessage());
// Log.e(TAG, ex.getMessage());
logError(ex);
Expand All @@ -80,18 +68,10 @@ public void uncaughtException(Thread thread, Throwable ex) {
} catch (InterruptedException e) {
// Log.e("debug", "error:", e);
}
// AppManagerUtils.removeAllActivities();
// AppManagerUtils.restartApp(mContext,mContext.getPackageName());
// AppManagerUtils.releaseAppResource();
exitApp();
}
}

/**
* 自定义错误处理,收集错误信息 发送错误报告等操作均在此完成.
*
* @param ex
* @return true:如果处理了该异常信息;否则返回false.
*/
private boolean handleException(Throwable ex) {
if (ex == null) {
return false;
Expand All @@ -101,25 +81,20 @@ private boolean handleException(Throwable ex) {
public void run() {
Looper.prepare();
Toast.makeText(mContext.getApplicationContext(),
"unknown exceptionPlease checking logs in sd card.", Toast.LENGTH_LONG).show();
"unknown exception and exiting...Please checking logs in sd card", Toast.LENGTH_LONG).show();
Looper.loop();

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}
}).start();
// 收集设备参数信息
collectDeviceInfo(mContext.getApplicationContext());
// 保存日志文件
logError(ex);
return true;
}

/**
* 收集设备参数信息
*
* @param ctx
*/
private void exitApp() {
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
}

public void collectDeviceInfo(Context ctx) {
try {
PackageManager pm = ctx.getPackageManager();
Expand All @@ -133,33 +108,26 @@ public void collectDeviceInfo(Context ctx) {
infos.put("versionCode", versionCode);
}
} catch (NameNotFoundException e) {
// Log.e(TAG, "收集包信息出现错误", e);
}
Field[] fields = Build.class.getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
infos.put(field.getName(), field.get(null).toString());
} catch (Exception e) {
// Log.e(TAG, "收集系统信息出现错误", e);
}
}
}

/**
* 保存错误信息到文件中
*
* @param ex
* @return 返回文件名称,便于将文件传送到服务器
*/

private void logError(Throwable ex) {

StringBuffer sb = new StringBuffer();
// for (Map.Entry<String, String> entry : infos.entrySet()) {
// String key = entry.getKey();
// String value = entry.getValue();
// sb.append(key + "=" + value + "\n");
// }
for (Map.Entry<String, String> entry : infos.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
sb.append(key + "=" + value + "\n");
}
int num = ex.getStackTrace().length;
for (int i=0;i<num;i++){
sb.append(ex.getStackTrace()[i].toString());
Expand All @@ -170,7 +138,7 @@ private void logError(Throwable ex) {
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
fos.write((sb.toString()+"异常:"+ex.getLocalizedMessage()).getBytes());
fos.write((sb.toString()+"exception:"+ex.getLocalizedMessage()).getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
Expand All @@ -182,7 +150,6 @@ private void logError(Throwable ex) {
e.printStackTrace();
}
}
// Log.e(TAG, "出现未捕捉异常,程序异常退出!", ex);
}

public Class<?> getMainActivityClass() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ protected void onCreate(Bundle savedInstanceState) {
}

private boolean isVersionM() {
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP;
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M;
}

private void checkAndRequestPermissions() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
import com.serenegiant.usb.encoder.RecordParams;
import com.serenegiant.usb.widget.CameraViewInterface;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -147,7 +148,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
mCameraHelper.setOnPreviewFrameListener(new AbstractUVCCameraHandler.OnPreViewResultListener() {
@Override
public void onPreviewResult(byte[] nv21Yuv) {

Log.d(TAG, "onPreviewResult: "+nv21Yuv.length);
}
});
}
Expand Down Expand Up @@ -227,7 +228,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
showShortMsg("sorry,camera open failed");
return super.onOptionsItemSelected(item);
}
String picPath = UVCCameraHelper.ROOT_PATH + MyApplication.DIRECTORY_NAME +"images/"+ System.currentTimeMillis()
String picPath = UVCCameraHelper.ROOT_PATH + MyApplication.DIRECTORY_NAME +"/images/"+ System.currentTimeMillis()
+ UVCCameraHelper.SUFFIX_JPEG;
mCameraHelper.capturePicture(picPath, new AbstractUVCCameraHandler.OnCaptureListener() {
@Override
Expand All @@ -243,7 +244,7 @@ public void onCaptureResult(String path) {
return super.onOptionsItemSelected(item);
}
if (!mCameraHelper.isPushing()) {
String videoPath = UVCCameraHelper.ROOT_PATH + MyApplication.DIRECTORY_NAME +"videos/"+ System.currentTimeMillis();
String videoPath = UVCCameraHelper.ROOT_PATH + MyApplication.DIRECTORY_NAME +"/videos/"+ System.currentTimeMillis();
FileUtils.createfile(FileUtils.ROOT_PATH + "test666.h264");
// if you want to record,please create RecordParams like this
RecordParams params = new RecordParams();
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<resources>
<string name="app_name">AndroidUSBCamera</string>
<string name="app_name">USBCamera</string>
</resources>
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ ext {
commonLibVersion= '2.12.4'
versionCompiler = 27
versionTarget = 27
minSdkVersion = 23
minSdkVersion = 21
versionNameString = '1.0.0'
javaSourceCompatibility = JavaVersion.VERSION_1_8
javaTargetCompatibility = JavaVersion.VERSION_1_8
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ public class UVCCameraHelper {
private static final String TAG = "UVCCameraHelper";
private int previewWidth = 640;
private int previewHeight = 480;
// 高分辨率YUV格式帧率较低
public static final int FRAME_FORMAT_YUYV = UVCCamera.FRAME_FORMAT_YUYV;
// 默认使用MJPEG
// Default using MJPEG
// if your device is connected,but have no images
// please try to change it to FRAME_FORMAT_YUYV
public static final int FRAME_FORMAT_MJPEG = UVCCamera.FRAME_FORMAT_MJPEG;
public static final int MODE_BRIGHTNESS = UVCCamera.PU_BRIGHTNESS;
public static final int MODE_CONTRAST = UVCCamera.PU_CONTRAST;
Expand Down Expand Up @@ -108,13 +109,13 @@ public void onConnect(final UsbDevice device, USBMonitor.UsbControlBlock ctrlBlo
new Thread(new Runnable() {
@Override
public void run() {
// 休眠500ms,等待Camera创建完毕
// wait for camera created
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 开启预览
// start previewing
startPreview(mCamView);
}
}).start();
Expand Down Expand Up @@ -172,13 +173,13 @@ public void updateResolution(int width, int height) {
new Thread(new Runnable() {
@Override
public void run() {
// 休眠500ms,等待Camera创建完毕
// wait for camera created
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 开启预览
// start previewing
startPreview(mCamView);
}
}).start();
Expand Down Expand Up @@ -238,7 +239,8 @@ public List<UsbDevice> getUsbDeviceList() {
.getDeviceFilters(mActivity.getApplicationContext(), R.xml.device_filter);
if (mUSBMonitor == null || deviceFilters == null)
return null;
return mUSBMonitor.getDeviceList(deviceFilters.get(0));
// matching all of filter devices
return mUSBMonitor.getDeviceList(deviceFilters);
}

public void capturePicture(String savePath,AbstractUVCCameraHandler.OnCaptureListener listener) {
Expand Down
Loading

1 comment on commit 9092e8c

@RiponDas
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Content is not allowed in prolog.

This error shows after opening in android studio.

Please sign in to comment.