3

写真を撮って画面に表示して変更するアプリケーションを作成しました。Eclipse エミュレーターで試してみるとカメラが動かないので、Galaxy Nexus スマートフォンで試しています。

それにもかかわらず、私の SP で実行すると、アプリケーションがクラッシュして、it unfortunally stopped working.

アプリを実行すると、これが正確に起こります。

  1. カメラ ボタンをクリックすると、カメラ インターフェイスが開きます
  2. 写真を撮った後、それを破棄するか開くかを選択できます
  3. 破棄をクリックすると、アプリケーションは通常の使用に戻ります
  4. [開く] をクリックすると、上記のようにアプリケーションがクラッシュします

ちょっとググったところ、ハードウェア デバイスを使用するにはアクセス許可が必要であることがわかりました。ここを確認してください。そのため、ファイルを作成しました/etc/udev/rules.d/51-android.rules。その内容は次のとおりです。

SUBSYSTEM=="USB", ATTR{IDVENDOR}=="18d1", MODE="0666, "GROUP="plugdev" SUBSYSTEM=="USB", ATTR{IDVENDOR}=="04e8", MODE="0666, "GROUP="plugdev" SUBSYSTEM=="USB", ATTR{IDVENDOR}=="0bb4", MODE="0666, "GROUP="plugdev"

しかし、それでもカメラを使用することはできません。

マニフェスト ファイルで宣言したアクセス許可は次のとおりです。

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

カメラ インテントを起動するために使用するコードは次のとおりです。

//create new Intent     
Intent cameraIntent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE );

//get something back from the activity we are starting
startActivityForResult( cameraIntent, CAMERA_PICTURE_REQUEST );

そして、これは結果を処理するためのコードです:

public void onActivityResult( int requestCode, int resultCode, Intent imageReturnedIntent ) 
{

    if( resultCode == RESULT_OK ) 
    {
        if( requestCode == GALLERY_PICTURE_REQUEST ) 
        {


            selectedImageUri = imageReturnedIntent.getData();

            Log.d( TAG, selectedImageUri );

            Intent intent = new Intent( DVAHLUI_SuperviseActivity.this, DVAHLUI_SelectImageContentActivity.class );


            intent.setData( selectedImageUri );
            startActivity( intent );


        }

        if( requestCode == CAMERA_PICTURE_REQUEST ) 
        {


            selectedImageUri = imageReturnedIntent.getData();
            Log.d( TAG, selectedImageUri );

            Intent intent = new Intent( DVAHLUI_SuperviseActivity.this, DVAHLUI_SelectImageContentActivity.class );


            intent.setData( selectedImageUri );
            startActivity( intent );


        }
    }
}

これは、Java Null ポインター例外を引き起こす getPath() 関数です。

public String getPath( Uri uri ) 
{
    String[] filePathColumn = { android.provider.MediaStore.Images.Media.DATA };

LINE 343 -->    Cursor cursor = getContentResolver().query( uri, filePathColumn, null, null, null );
    cursor.moveToFirst();

    int columnIndex = cursor.getColumnIndexOrThrow( filePathColumn[0] );
    String filePath = cursor.getString( columnIndex );

    cursor.close();

    return filePath;

}

何が問題なのか教えてください。

LOGCAT を投稿するためのフォゴット:

E/AndroidRuntime(27859): FATAL EXCEPTION: main
E/AndroidRuntime(27859): java.lang.RuntimeException: Failure delivering result ResultInfo{who=supervise, request=1, result=-1, data=Intent { act=inline-data (has extras) }} to activity {com.DVA_HLUI/com.DVA_HLUI.DVAHLUI_TabModeActivity}: java.lang.NullPointerException 
E/AndroidRuntime(27859):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
E/AndroidRuntime(27859):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
E/AndroidRuntime(27859):    at android.app.ActivityThread.access$1100(ActivityThread.java:130)
E/AndroidRuntime(27859):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
E/AndroidRuntime(27859):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(27859):    at android.os.Looper.loop(Looper.java:137) E/AndroidRuntime(27859):     at android.app.ActivityThread.main(ActivityThread.java:4745)
E/AndroidRuntime(27859):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(27859):    at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(27859):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
E/AndroidRuntime(27859):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
E/AndroidRuntime(27859):    at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(27859): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(27859):    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1094)
E/AndroidRuntime(27859):    at android.content.ContentResolver.query(ContentResolver.java:354)
E/AndroidRuntime(27859):    at android.content.ContentResolver.query(ContentResolver.java:313)
E/AndroidRuntime(27859):    at com.DVA_HLUI.DVAHLUI_SuperviseActivity.getPath(DVAHLUI_SuperviseActivity.java:343)
E/AndroidRuntime(27859):    at com.DVA_HLUI.DVAHLUI_SuperviseActivity.onActivityResult(DVAHLUI_SuperviseActivity.java:312)
E/AndroidRuntime(27859):    at android.app.ActivityGroup.dispatchActivityResult(ActivityGroup.java:122)
E/AndroidRuntime(27859):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
E/AndroidRuntime(27859):    ... 11 more
4

3 に答える 3

2

どうやらこのクラッシュはSamsungの既知の問題が原因であるようです。Uriカメラインテントを呼び出す前に作成する必要があるようです。このように、onActivityResultメソッドを実行すると、コンテンツプロバイダーはリソースを保存する場所をすでに割り当てています。

詳細については、以下を確認してください。

グーグルでもっとたくさん...

PSできるだけ早く私は私のために働いた解決策を投稿します。

于 2012-09-25T07:07:53.747 に答える
2

新しいメディアファイルが作成されたことをシステムが更新できないように聞こえます。それがあなたのメソッドが失敗している理由です。画像ファイルのパスを手動で作成して、ファイルツリーに画像の場所を設定するか、メディアサービスを呼び出して更新を実行することができます。古い電話はメディアサービスを使用して更新するのに時間がかかり、その場合のメソッドは失敗するため、私は常に独自のファイルパスを作成します。

于 2012-09-24T19:48:46.790 に答える
0

回答が遅れていることは承知していますが、回答した回答をできるだけ早く見つけたので、少なくとも確認してください。

AndroidCameraUtilは、すべてのデバイスごとに優れた簡単なソリューションになる可能性があります。以下は、ライブラリで使用できるコード スニペットです。

 private void setupCameraIntentHelper() {
    mCameraIntentHelper = new CameraIntentHelper(this, new CameraIntentHelperCallback() {
        @Override
        public void onPhotoUriFound(Date dateCameraIntentStarted, Uri photoUri, int rotateXDegrees) {
            messageView.setText(getString(R.string.activity_camera_intent_photo_uri_found) + photoUri.toString());

            Bitmap photo = BitmapHelper.readBitmap(CameraIntentActivity.this, photoUri);
            if (photo != null) {
                photo = BitmapHelper.shrinkBitmap(photo, 300, rotateXDegrees);
                ImageView imageView = (ImageView) findViewById(de.ecotastic.android.camerautil.sample.R.id.activity_camera_intent_image_view);
                imageView.setImageBitmap(photo);
            }
        }

        @Override
        public void deletePhotoWithUri(Uri photoUri) {
            BitmapHelper.deleteImageWithUriIfExists(photoUri, CameraIntentActivity.this);
        }

        @Override
        public void onSdCardNotMounted() {
            Toast.makeText(getApplicationContext(), getString(R.string.error_sd_card_not_mounted), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCanceled() {
            Toast.makeText(getApplicationContext(), getString(R.string.warning_camera_intent_canceled), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onCouldNotTakePhoto() {
            Toast.makeText(getApplicationContext(), getString(R.string.error_could_not_take_photo), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onPhotoUriNotFound() {
            messageView.setText(getString(R.string.activity_camera_intent_photo_uri_not_found));
        }

        @Override
        public void logException(Exception e) {
            Toast.makeText(getApplicationContext(), getString(R.string.error_sth_went_wrong), Toast.LENGTH_LONG).show();
            Log.d(getClass().getName(), e.getMessage());
        }
    });
}

@Override
protected void onSaveInstanceState(Bundle savedInstanceState) {
    super.onSaveInstanceState(savedInstanceState);
    mCameraIntentHelper.onSaveInstanceState(savedInstanceState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    mCameraIntentHelper.onRestoreInstanceState(savedInstanceState);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    mCameraIntentHelper.onActivityResult(requestCode, resultCode, intent);
}
}
于 2015-12-07T04:17:02.370 に答える