应用程序崩溃时使用CAMERA - Android

时间:2012-09-24 19:18:08

标签: java android android-contentprovider android-cursor

我写了一个应该拍照的应用程序,然后在屏幕上显示进行修改。 在eclipse仿真器上尝试时,相机无法工作,所以我在Galaxy Nexus智能手机上试用它。

然而,当在我的SP上运行它时,应用程序将崩溃说it unfortunally stopped working

执行应用程序时,这恰好发生了什么:

  1. 我点击相机按钮,相机界面打开
  2. 拍完照片后,我可以选择丢弃或打开它
  3. 如果我点击放弃,该应用程序将恢复正常使用
  4. 如果我点击打开应用程序崩溃,如上所述
  5. 我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 TO POST 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
    

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

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

有关详细信息,请查看以下内容:

通过谷歌搜索等等......

P.S。我会尽快发布适合我的解决方案。

答案 2 :(得分:0)

我知道回答它已经很晚了但是我发现了我回答的答案,所以请至少回顾一下。

AndroidCameraUtil对于下面的每个设备都可以很好,简单的解决方案是您可以与库一起使用的代码段

\s*