2011-03-09 3 views
1

J'ai le scénario suivant qui tire tout à fait mes cheveux: J'écris une classe pour gérer la caméra Android, ce qui étend l'activité. Dans cette classe j'ai le code ci-dessous. Ce qui se passe est que je reçois toujours exception de point nul --with sa force proche peu friend-- dans la ligne qui dit:Android: startActivityForResult toujours nul et force fermer mon application

startActivityForResult(intent, 0); 

Cependant, je reçois System.out.println (« intention non nulle »); imprimé ok dans LogCat ...

Le LogCat dit:

03-08 22:46:38.584: ERROR/AndroidRuntime(1079): java.lang.NullPointerException 
03-08 22:46:38.584: ERROR/AndroidRuntime(1079):  at android.app.Activity.startActivityForResult(Activity.java:2749) 
03-08 22:46:38.584: ERROR/AndroidRuntime(1079):  at com.test.cameratest.startCameraActivity(cameratest.java:39) 

Dans le manifeste, j'ai:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-feature android:name="android.hardware.camera"/> 
<activity android:name=".cameratest" /> 

Alors, ce que je fais mal ?? Pourquoi startActivityForResult renvoie toujours null !?

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
} 

/** As per suggestion tried to change the method from protected to private or public 
but still have the same problem */ 
protected void startCameraActivity() 
{ 
    String path = (new StringBuilder()).append(Environment.getExternalStorageDirectory()).append("/images/test.jpg").toString(); 

    System.out.println("started"); 

    File file = new File(path); 

    System.out.println(path); 

    Uri outputFileUri = Uri.fromFile(file); 

    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 

    intent.putExtra("output", outputFileUri); 
    /** Removed as per suggestion 
    if (intent!=null) 
    { 
     System.out.println("intent not null"); 
      **startActivityForResult(intent, 0);** 
    } 
    */  

    **startActivityForResult(intent, 0);** <== null pointer exception 
} 

ÉDITÉE:

Comme par suggestion, je pris un coup d'œil à la ligne 2749 sur Activity.java du cadre Android et 2.1r2 est le code ici:

public void startActivityForResult(Intent intent, int requestCode) { 
     if (mParent == null) { 

       **** Line 2749 is the folowing     
       Instrumentation.ActivityResult ar = 
       mInstrumentation.execStartActivity(
        this, mMainThread.getApplicationThread(), mToken, this, 
        intent, requestCode); 
       **** 

      if (ar != null) { 
       mMainThread.sendActivityResult(
        mToken, mEmbeddedID, requestCode, ar.getResultCode(), 
        ar.getResultData()); 
      } 
      if (requestCode >= 0) { 
       // If this start is requesting a result, we can avoid making 
       // the activity visible until the result is received. Setting 
       // this code during onCreate(Bundle savedInstanceState) or onResume() will keep the 
       // activity hidden during this time, to avoid flickering. 
       // This can only be done when a result is requested because 
       // that guarantees we will get information back when the 
       // activity is finished, no matter what happens to it. 
       mStartedActivity = true; 
      } 
     } else { 
      mParent.startActivityFromChild(this, intent, requestCode); 
     } 
    } 

ligne 2749 est marqué avec double ** Cependant, je ne vois pas de problème avec ce code

EDITED

oublié d'expliquer comment j'appelle ceci:

cameratest cam = new cameratest(); 
cam.startCameraActivity(); 
+0

Puisque vous avez passé 'intent.putExtra (...)', la vérification de 'intent! = Null' est inutile. Ce n'est pas le problème. Je regarde la ligne 2749 de Activity.java pour la version du système d'exploitation que vous utilisez. Cela pourrait fournir un indice. Vous pouvez trouver les sources de cadre [ici] (http://android.git.kernel.org/?p=platform/frameworks/base.git;a=summary) –

+0

Merci Ted, mais je ne vois pas de problème là non plus, ou autant que je sache. J'ai également découvert que, quelle que soit l'activité que je souhaite démarrer, elle me renvoie toujours une erreur d'exception nulle. J'ai essayé avec des bribes pour obtenir les contacts et composer un numéro ... –

+0

Je pense que le problème peut être dû à la méthode qui est "protégée". Essayez de le rendre 'private' –

Répondre

0

Essayez Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

Je ne pense pas que les références de ces chaînes constantes sont nécessairement égaux lorsque leurs valeurs.

+0

Merci Matthew, j'ai essayé cette ligne et toujours rien ... Je reçois le même problème. –

0

L'article suivant fournit une solution à ce problème, non seulement pour les appareils Samsung (j'ai un problème identique sur Android 2.3.7 HTC Desire Z en cours d'exécution modded):

http://kevinpotgieter.wordpress.com/2011/03/30/null-intent-passed-back-on-samsung-galaxy-tab/

Je me rends compte qu'il est assez gênant, mais ça fonctionne. Pour récapituler, il suggère d'abandonner les tentatives pour obtenir l'intention originale et dit simplement comment obtenir une poignée de la photo capturée.