【问题标题】:GDK. While using CAMERA, OnActivityResult() not getting triggeredGDK。使用 CAMERA 时,未触发 OnActivityResult()
【发布时间】:2014-02-13 17:10:44
【问题描述】:

如 GDK 教程中所述,我正在使用 GDK 试验相机 API,但我根本没有触发我的 OnActivityResult API。我不确定为什么会这样,为您的参考附加代码 sn-p。提前感谢您的帮助。

// The "main" activity...
public class LiveCardDemoActivity extends Activity
{

    /* Camera section : Start */
    private void takePicture() {

        try
        {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            startActivityForResult(intent, TAKE_PICTURE_REQUEST);

            Log.d("takePicture() is complete...");
        }
        catch ( Exception ex)
        {
            Log.d("takePicture() thrown an exception :"+ex.getMessage());
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == TAKE_PICTURE_REQUEST && resultCode == RESULT_OK) {
            String picturePath = data.getStringExtra(
                    CameraManager.EXTRA_PICTURE_FILE_PATH);
            processPictureWhenReady(picturePath);
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

    private void processPictureWhenReady(final String picturePath) {

        Log.d("Yayyyyyyyyyy.... Camera is working...");

        displayProgress("Activating STB ...",R.drawable.menu_icon_record);
    }

   @Override
    protected void onDestroy()
    {
        //doUnbindService(); -- GD
        super.onDestroy();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Log.d("Beta: onCreate() called.");

        createCards();
        mCardScrollView = new CardScrollView(this);
        m_viewAdapter = new ExampleCardScrollAdapter();
        mCardScrollView.setAdapter(m_viewAdapter);
        mCardScrollView.activate();

        setContentView(mCardScrollView);

        /* -- GD
        setContentView(R.layout.activity_livecarddemo);
        */

        // For gesture handling.
        mGestureDetector = createGestureDetector(this);

        // doStartService(); --GD
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        Log.d("Beta: onResume() called.");

        // For live card menu handling
        //openOptionsMenu();  --GD
    }

    // Context menus
    // ...

    @Override
    public boolean onCreateOptionsMenu(Menu menu)
    {
        Log.d("onCreateOptionsMenu() called.");

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_livecarddemo_livecard, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        Log.d("onOptionsItemSelected() called.");

        // Handle item selection.
        switch (item.getItemId()) {
            case R.id.menu_item_Direction:
                Navigate();
                break;
            case R.id.menu_item_Scan:
                scan_Codes();
                break;
            case R.id.menu_item_Activate:
                takePicture();
                break;
            default:
                 break;
        }

        //return super.onOptionsItemSelected(item);
        return true;
    }


   @Override
    public void onOptionsMenuClosed(Menu menu)
    {
        Log.d("onOptionsItemSelected() called.");

        // Nothing else to do, closing the activity.
        finish();
    }

    @Override
    public boolean onGenericMotionEvent(MotionEvent event) {
        if (mGestureDetector != null) {
            return mGestureDetector.onMotionEvent(event);
        }
        return false;
    }

    private GestureDetector createGestureDetector(Context context) {
        GestureDetector gestureDetector = new GestureDetector(context);
        // Create a base listener for generic gestures
        gestureDetector.setBaseListener(new GestureDetector.BaseListener() {
            @Override
            public boolean onGesture(Gesture gesture) {
                if (Log.D)
                    Log.d("gesture = " + gesture);
                /*if(gesture == Gesture.SWIPE_RIGHT)
                {
                    scrollLiveCards();
                    return true;
                } */

                 if (gesture == Gesture.TAP || gesture == Gesture.LONG_PRESS) {
                    handleGestureTap();
                    return true; 
                } else if (gesture == Gesture.TWO_TAP) {
                    handleGestureTap();
                    //handleGestureTwoTap();
                    return true;
                }
                return false;
            }
        });
        return gestureDetector;
    }

    private void handleGestureTap() {
        Log.d("handleGestureTap() called.");
        //doStopService(); -- GD
        //finish(); -- GD
        openOptionsMenu();
    }

}

【问题讨论】:

    标签: android-intent android-camera google-glass


    【解决方案1】:

    我的应用程序调用了 onCreate 中的两行代码:

    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, TAKE_PICTURE_REQUEST);
    

    并且 onActivityResult 被调用没有问题。因此,您可能想直接在 onCreate 中尝试代码。

    另外,请确保您的 AndroidManifest.xml 包含以下内容:

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

    【讨论】:

    • 杰夫。感谢您的反馈。当我将 OnActivity() 包含在 OnCreate() 中时,它正在工作,但当我将它作为上下文菜单事件方法 () 的一部分包含时它不起作用。有什么反馈吗?
    • Acarin,问题出在您的方法 onOptionsMenuClosed(Menu menu) 中,该方法在您选择菜单后被调用 - 您不应该在那里调用 finish(),否则 onActivityResult 将没有机会在活动已关闭时运行。将 finish() 移到 onActivityResult 中,它会起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多