2014-03-07 5 views
1

내 앱에는 기본 카메라에서 캡처하는 코드가 있습니다. startActivityForResultSamsung S3 네이티브 카메라의 이상한 문제로 인해 충돌이 발생합니다.

넥서스 5, HTC 1, 넥서스 7, 삼성 S4 및 삼성 S3에서 테스트되었습니다. 그것은 S3를 제외한 모든 장치에서 훌륭하게 작동합니다. S3에 앱이 시작 활동 복귀에 추락

충돌 :

03-07 13:09:21.297: E/ActivityThread(6535): Activity com.DRPMapViewActivity 
has leaked ServiceConnection [email protected] that 
was originally bound here 
03-07 13:09:21.297: E/ActivityThread(6535): android.app.ServiceConnectionLeaked: 
Activity com.DRPMapViewActivity has leaked ServiceConnection 
[email protected] that was originally 
bound here 

내 코드

내 onActivityResult를이 모양
private File createImageFile() throws IOException { 
      // Create an image file name 
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") 
        .format(new Date()); 
      String imageFileName = "JPEG_" + timeStamp + "_"; 
      File storageDir = new File(g.kPhotoDirectory); 
      // File storageDir = new 
      // File(Environment.getExternalStoragePublicDirectory(
      // Environment.DIRECTORY_DCIM), "Drop"); 
      storageDir.mkdirs(); 
      File image = File.createTempFile(imageFileName, /* prefix */ 
        ".jpg", /* suffix */ 
        storageDir /* directory */ 
      ); 

      // Save a file: path for use with ACTION_VIEW intents 
      mCurrentPhotoPath = image.getAbsolutePath(); 

      return image; 
     } 

     private void dispatchTakePictureIntent() { 
      Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      // Ensure that there's a camera activity to handle the intent 
      if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
       // Create the File where the photo should go 

       photoFileFromCapture = null; 
       try { 
        photoFileFromCapture = createImageFile(); 
       } catch (IOException ex) { 
        // Error occurred while creating the File 

       } 
       // Continue only if the File was successfully created 
       if (photoFileFromCapture != null) { 
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
          Uri.fromFile(photoFileFromCapture)); 
        startActivityForResult(takePictureIntent, 
          g.kRequestImageCaptureCode); 
       } 
      } 
     } 

     private void dispatchChoosePictureIntent() { 
      Intent i = new Intent(Intent.ACTION_PICK, 
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      i.setType("image/*"); 

      // Intent chooserIntent = Intent.createChooser(i,"Image Chooser"); 

      startActivityForResult(i, g.kRequestImageChooserCode); 
     } 

:

@Override 
     protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
      super.onActivityResult(requestCode, resultCode, data); 
      if (requestCode == g.kGenericRequestCode) { 
       if (resultCode == g.kKillMeResultCode) { 
        finish(); 
       } 
       Log.v("activityResult", "requestcode:" + requestCode 
         + " resultCode:" + resultCode + " data:" + data); 
       super.onActivityResult(requestCode, resultCode, data); 
      } 
      if (requestCode == g.kRequestImageChooserCode 
        && resultCode == Activity.RESULT_OK) { 
       Uri imageUri = data.getData(); 
       Log.v("CAPTURE", "uri:" + imageUri); 
       String filePath = getRealPathFromURI(imageUri); 
       Intent i = new Intent(DRPMapViewActivity.this, 
         DRPCreateDropActivity.class); 
       i.putExtra("USER", _user); 
       i.putExtra("LATLNG", getLocationForCreateDrop()); 
       i.putExtra("FILE_PATH", filePath); 
       i.putExtra("TYPE", CreateDropType.kImageFile); 
       startActivity(i); 
       overridePendingTransition(R.anim.slide_in_right, 
         R.anim.slide_out_left); 
      } 
      if (requestCode == g.kRequestImageCaptureCode) { 
       Log.v("CAPTURE RESULT", "result:" + resultCode); 
       if(resultCode== Activity.RESULT_OK){ 
       MediaScannerConnection.scanFile(this, 
         new String[] { mCurrentPhotoPath }, null, 
         new MediaScannerConnection.OnScanCompletedListener() { 
          public void onScanCompleted(String path, Uri uri) { 

          } 
         }); 
       Intent i = new Intent(DRPMapViewActivity.this, 
         DRPCreateDropActivity.class); 
       i.putExtra("USER", _user); 
       i.putExtra("LATLNG", getLocationForCreateDrop()); 
       i.putExtra("FILE_PATH", mCurrentPhotoPath); 
       i.putExtra("TYPE", CreateDropType.kImageFile); 
       startActivity(i); 
       overridePendingTransition(R.anim.slide_in_right, 
         R.anim.slide_out_left); 
       if (data != null) { 
        Log.v("CAPTURE RESULT", "data:" + data.getData()); 
       } 
       } 
      } 

     } 

답변

2

그래서 문제는 Samsung S3의 기본 카메라가 결과를 설정할 때 데이터를 반환하지 않는 이유가 무엇인지에 대한 것 같습니다. 따라서 적절한 결과 코드를 얻는 동안 실제 데이터가 전달되지 않습니다. 이 결과를 내 결과 수신기에서 수정하려면 데이터가 null인지 확인해야합니다. 데이터는 찍은 사진의 파일 경로라고 가정합니다. 경로가 null의 경우 & & 결과 코드가 난 그냥에서 사진을 저장하고 마지막으로 만든 파일 :

if(heroFilePath==null){ 
     File dir = new File(g.kPhotoDirectory); 

     File[] files = dir.listFiles(); 

     File lastModifiedFile = files[0]; 

     for (int i = 1; i < files.length; i++) { 
      if (lastModifiedFile.lastModified() < files[i].lastModified()) { 
       lastModifiedFile = files[i]; 
      } 
     } 
     heroFilePath = lastModifiedFile.getAbsolutePath(); 
    } 
의 경로를 얻을 수있는 카메라를 말한 디렉토리를 통해 반복, RESULT_OK입니다