【问题标题】:Application Crash when using CAMERA - Android使用 CAMERA 时应用程序崩溃 - Android
【发布时间】:2012-09-24 19:18:07
【问题描述】:

我编写了一个应用程序,它应该拍摄一张照片,然后将其显示在屏幕上以供修改。 在 eclipse 模拟器上尝试时,相机无法工作,所以我在我的 Galaxy Nexus 智能手机上尝试。

尽管如此,在我的 SP 上运行它时,应用程序会崩溃,提示 it unfortunally stopped working

在执行应用程序时,这正是发生的情况:

  1. 我点击相机按钮,相机界面打开
  2. 拍照后,我可以选择丢弃或打开它
  3. 如果我点击放弃应用程序将恢复正常使用
  4. 如果我点击打开应用程序如上所述崩溃

我google了一下,发现你需要使用硬件设备check here的权限,所以我创建了文件/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;

}

你能告诉我出了什么问题吗?

FOGOT 发布 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

【问题讨论】:

  • logcat 对这个问题的看法是什么
  • @SharathG - 发现了一些有趣的东西,似乎是函数 getPath() 导致了 java 空指针异常......你能帮帮我吗?提前
  • 检查 uri 是否有值。我认为 uri 没有导致 nullpointer 的路径
  • @SharathG - uri 不应该由内容提供者设置吗?
  • 您的 logcat 似乎表明这与相机无关,而是在某处浮动有一个空指针。我建议编辑您的帖子(标题和所有内容)以准确反映实际问题并消除无关信息。

标签: java android android-contentprovider android-cursor


【解决方案1】:

听起来和看起来您不允许系统自行更新已创建新媒体文件。这就是你的方法失败的原因。您可以手动创建图像文件路径,以便在文件树上拥有图像位置,也可以调用媒体服务来运行更新。我总是创建自己的文件路径,因为旧手机需要更长时间才能使用媒体服务进行更新,因此在这种情况下您的方法会失败。

【讨论】:

    【解决方案2】:

    显然,这次崩溃是由于三星的一个已知问题:您似乎需要在调用相机意图之前创建一个Uri,这样在运行onActivityResult 方法时 内容提供者已经分配了保存资源的位置。

    欲了解更多信息,请查看以下内容:

    还有更多通过谷歌搜索...

    附:我会尽快发布对我有用的解决方案。

    【讨论】:

    • 在我的 Nexus 4 上使用相机拍摄视频时遇到了同样的问题。
    • @Matteo 非常感谢您将这些问题归为一类,这真的很有帮助。如果可能,请提供您的答案。如果可以的话,+1 一百万
    【解决方案3】:

    我知道现在回答它已经很晚了,但我尽快找到了我回答的答案,所以请至少查看它。

    AndroidCameraUtil 对于下面的每个设备来说可能是一个不错且简单的解决方案,您可以将代码 sn-p 与库一起使用

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 2012-10-04
      • 1970-01-01
      相关资源
      最近更新 更多