1

私のアプリには、ネイティブ カメラからキャプチャを呼び出す次のコードがあります。startActivityForResult

nexus 5、HTC 1、nexus 7、Samsung S4、および Samsung S3 でテスト済みです。S3を除くすべてのデバイスでうまく機能します。S3 では、開始アクティビティに戻るとアプリがクラッシュしました

クラッシュ:

03-07 13:09:21.297: E/ActivityThread(6535): Activity com.DRPMapViewActivity 
has leaked ServiceConnection android.media.MediaScannerConnection@42bd73d8 that 
was originally bound here
03-07 13:09:21.297: E/ActivityThread(6535): android.app.ServiceConnectionLeaked: 
Activity com.DRPMapViewActivity has leaked ServiceConnection
android.media.MediaScannerConnection@42bd73d8 that was originally
bound here

私のコード

  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);
        }

私の onActivityResult は次のようになります。

    @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());
                }
                }
            }

        }
4

1 に答える 1

2

したがって、問題は、何らかの理由でSamsung S3のネイティブカメラが結果を設定するときにデータを返さないことです。そのため、適切な結果コードを取得しても、実際のデータは返されません。結果リスナーでこれを修正するには、データが null かどうかを確認します。データは、撮影した写真のファイル パスと見なされます。RESULT_OKパスが 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();
   }
于 2014-03-12T15:14:10.343 に答える