Android: startActivityForResult всегда имеет значение null и принудительно закрывает мое приложение - PullRequest
1 голос
/ 09 марта 2011

У меня есть следующий сценарий, который меня очень волнует: я пишу класс для управления камерой Android, который расширяет активность. Внутри этого класса у меня есть код ниже. То, что происходит, - то, что я всегда получаю исключение нулевой точки - с его силой близкий маленький друг - в строке, которая говорит:

startActivityForResult(intent, 0);

Однако я получаю System.out.println («намерение не ноль»); печатается нормально в LogCat ...

LogCat говорит:

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)

В манифесте у меня есть:

<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" />

Итак, что я делаю не так? Почему startActivityForResult всегда выбрасывает ноль!?

@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
}

РЕДАКТИРОВАНИЕ:

Согласно предложению, я взглянул на строку 2749 на Activity.java из платформы Android 2.1r2 и вот код:

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

Строка 2749 помечена двойным ** Однако я не вижу проблем с этим кодом

EDITED

Забыл объяснить, как я это называю:

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

Ответы [ 2 ]

0 голосов
/ 10 мая 2012

В следующей статье представлен обходной путь для этой проблемы не только для устройств Samsung (у меня есть идентичная проблема с HTC Desire Z под управлением модовой версии Android 2.3.7):

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

Я понимаю, что это довольно неловко, но это работает.Подводя итог, он предлагает отказаться от попыток получить первоначальное намерение и просто рассказывает, как получить дескриптор захваченной фотографии.

0 голосов
/ 09 марта 2011

Попробуйте Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

Я не думаю, что ссылки на эти константные строки обязательно равны, когда их значения равны.

...