我的应用使用MediaStore.ACTION_IMAGE_CAPTURE Intent拍照。问题是,在我按下快门按钮之后但在" OK"之前,应用程序间歇性地崩溃了。和"取消"显示允许我重新拍摄或接受照片的按钮。 Ok和Cancel按钮选择是intent的一部分而不是我的代码,因此崩溃似乎不是由我的代码直接引起的。
应用程序刚关闭并且没有显示错误消息,logcat没有做出反应,并且cpu /网络/内存监视器突然停止并说“#34;监视器被禁用"。
private void dispatchTakePictureIntent() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, getPhotoFileUri(photoFileName));
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
}
photoFileName始终为file:///storage/emulated/0/Android/data/com.companyname.appname/files/Pictures/AppName/myphoto.jpg
拍摄照片后,将由此代码处理
private List<Bitmap> myImages;
enter code here
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_CANCELED) {
if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
if (resultCode == RESULT_OK) {
Uri takenPhotoUri = getPhotoFileUri(photoFileName);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Bitmap takenImage = BitmapFactory.decodeFile(takenPhotoUri.getPath(), options);
//Store image in memory
myImages.add(takenImage);
if (myImagesAdapter == null) {
myImagesAdapter = new MyImagesListViewAdapter(this, myImages);
GridView myListView = (GridView) findViewById(R.id.my_images_view);
myListView.setAdapter(myImagesAdapter);
myImagesAdapter.notifyDataSetChanged();
} else {
myImagesAdapter.notifyDataSetChanged();
}
} else { // Result was a failure
Toast.makeText(this, "Picture wasn't taken!", Toast.LENGTH_SHORT).show();
}
}
}
}
另外看起来这种情况经常发生/仅在调试模式下(按下android studio中的错误)而不是在我运行它时(按下播放按钮)。
这是在拍摄第一张照片时发生的,但也发生在第二张,第三张和第四张照片上。
更新1 当我将logcat更改为ha No Filters时,我得到这些行
09-06 22:30:26.961 990-1473 /? I / WindowState:WIN DEATH:Window {296d6791 u0 com.mycompany.myapp / com.mycompany.myapp.MyFirstActivity}
09-06 22:30:26.965 990-1473 /? D / InputDispatcher:Window消失了:Window {296d6791 u0 com.mycompany.myapp / com.mycompany.myapp.MyFirstActivity}
09-06 22:30:26.968 990-2174 /? I / WindowState:WIN DEATH:Window {3ac0ee0b u0 com.mycompany.myapp / com.mycompany.myapp.MySecondActivity}
09-06 22:30:26.971 990-2174 /? D / InputDispatcher:Window消失了:Window {3ac0ee0b u0 com.mycompany.myapp / com.mycompany.myapp.MySecondActivity}
09-06 22:30:27.059 990-1819 /? I / ActivityManager:进程com.mycompany.myapp(pid 8623)已经死亡
09-06 22:30:27.626 990-2174 /? I / ActivityManager:强制停止com.mycompany.myapp appid = 10170 user = 0:from pid 9949
09-06 22:30:27.627 990-2174 /? I / ActivityManager:强制完成活动ActivityRecord {18ca1aa0 u0 com.mycompany.myapp / .MyFirstActivity t254}
09-06 22:30:27.631 990-2174 /? I / ActivityManager:强制完成活动ActivityRecord {15946ece u0 com.mycompany.myapp / .MySecondActivity t254}
09-06 22:30:27.666 2249-2249 /? W / NearbyMessages:ClientAppContext:0P标识符(com.mycompany.myapp),没有0P前缀(0p:)
答案 0 :(得分:0)
如果我删除任何具有相同名称的预先存在的文件,那么问题似乎不那么频繁(没有补救),所以我将第一个方法更改为
private void dispatchTakePictureIntent() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri filename = getPhotoFileUri(photoFileName);
File imageFile = new File(filename.getPath());
if (imageFile.exists()) {
imageFile.delete();
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, filename);
if (intent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}
}
和
的第二种方法protected void onActivityResult(int requestCode, int resultCode, Intent data) {
...
Bitmap takenImage = BitmapFactory.decodeFile(takenPhotoUri.getPath(), options);
File imageFile = new File(takenPhotoUri.getPath());
if (imageFile.exists()) {
imageFile.delete();
}
myImages.add(takenImage);
...
答案 1 :(得分:0)
不知何故,这只发生在调试模式下。使用&#34;运行&#39;&#39;&#34;它永远不会崩溃。不知道为什么会这样。
在logcat中,如果我过滤到所选应用程序(详细),我得到第一行,然后是下一行的几行
10-07 13:54:48.538 16352-16352 / com.fujitsu.helgaclient W / ContextImpl:无法确保目录:/storage/external_SD/Android/data/com.fujitsu.helgaclient/files/Pictures
10-07 13:54:50.282 16352-16352 / com.fujitsu.helgaclient D / BubblePopupHelper:isShowingBubblePopup:false
当我启动相机意图然后什么都没有时,我就会知道这些。因此,当我按下快门和应用程序崩溃时,logcat对当前应用程序没有显示任何内容。如果我删除了过滤器,那么就会记录下来,因此无法在崩溃的同时找到发出的行。