2012-06-06 41 views
1

我很抱歉再次詢問相同內容,但在查找答案後,我沒有一個可正常工作的代碼。Android onActivityResult從未啓動

n這就是我所說的活性主要功能:

package com.phonegap.CameraPluginTest; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 

import com.phonegap.DroidGap; 

public class CameraPluginTest2_3Activity extends DroidGap { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     super.loadUrl("file:///android_asset/www/index.html"); 
     try{ 
      CustomCamera camera = new CustomCamera(this); 
      appView.addJavascriptInterface(camera, "CustomCamera"); 
      //camera.Cameratest(); 
      //camera.startCamera(50); 
     }catch(Exception ex){ 
      ex.printStackTrace(); 
      Log.e("RapportsError", "error" + ex.toString()); 
     } 
    } 

    public class CustomCamera{ 
     private Context context; 

     public CustomCamera (Context context){ 
      this.context = context; 

     } 

     public void Cameratest() { 
      Log.e("RapportsError", "Cameratest"); 

     } 
     public void startCamera(int quality) 
     { 
      Log.e("RapportsError", "intent"); 
      try{ 

       Intent i = new Intent(context, CameraPreview.class); 

       i.setAction("android.intent.action.PICK"); 
       i.putExtra("quality", quality); 
       startActivityForResult(i, 1); 
       Log.e("RapportsError", "despues de intent"); 
      }catch(Exception ex){ 
       ex.printStackTrace(); 
       Log.e("RapportsError", "error" + ex.toString()); 
      } 
     } 

     protected void onActivityResult(int reqCode, int resCode, Intent intent) 
     { 
      String data;    
      Log.e("RapportsError", "ON ACTIVITY RESULT " + reqCode); 
      //super.onActivityResult(requestCode, resultCode, intent); 
      if (resCode == RESULT_OK) 
      { 
       data = intent.getStringExtra("picture"); 
       Log.e("RapportsError", "error" + data); 
       // Send the graphic back to the class that needs it 
       //launcher.processPicture(data); 
      } 
      else 
      { 
       //launcher.failPicture("Did not complete!"); 
      } 
     } 

    } 

} 

這是被稱爲類

package com.phonegap.CameraPluginTest; 

import java.io.ByteArrayOutputStream; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 

import java.io.IOException; 
import java.util.List; 

import org.apache.commons.codec.binary.Base64; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.PixelFormat; 
import android.graphics.Bitmap.CompressFormat; 
import android.graphics.Rect; 
import android.hardware.Camera; 
import android.hardware.Camera.Size; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.KeyEvent; 
import android.view.MenuItem; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.RelativeLayout; 
import android.widget.Toast; 

import android.graphics.YuvImage; 
import android.os.Environment; 

public class CameraPreview extends Activity implements SurfaceHolder.Callback{ 

    private static final String TAG = "PhoneGapCamera"; 
    private SurfaceView mSurfaceView; 
    private SurfaceHolder mSurfaceHolder; 

    private RelativeLayout root; 

    Camera mCamera; 
    boolean mPreviewRunning = false; 

    int quality; 
    Intent mIntent; 

    public void onCreate(Bundle icicle) 
    { 
     super.onCreate(icicle); 

     Log.e(TAG, "onCreate"); 

     getWindow().setFormat(PixelFormat.TRANSLUCENT); 

     RelativeLayout.LayoutParams containerParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
       ViewGroup.LayoutParams.FILL_PARENT); 
     LinearLayout.LayoutParams surfaceParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 
       ViewGroup.LayoutParams.FILL_PARENT, 0.0F); 
     RelativeLayout.LayoutParams buttonParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, 
       ViewGroup.LayoutParams.WRAP_CONTENT); 

     root = new RelativeLayout(this); 
     root.setLayoutParams(containerParams); 

     mSurfaceView = new SurfaceView(this); 
     mSurfaceView.setLayoutParams(surfaceParams); 
     root.addView(mSurfaceView); 

     Button stopButton = new Button(this); 
     stopButton.setText("click"); 
     buttonParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     buttonParams.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
     buttonParams.rightMargin = 5; 
     buttonParams.topMargin = 5; 

     stopButton.setLayoutParams(buttonParams); 
     root.addView(stopButton); 

     setContentView(root); 

     mSurfaceHolder = mSurfaceView.getHolder(); 
     mSurfaceHolder.addCallback(this); 
     mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);      
     mIntent = this.getIntent(); 

     quality = mIntent.getIntExtra("quality", 100); 


     stopButton.setOnClickListener(mSnapListener); 
    } 

    private OnClickListener mSnapListener = new OnClickListener() { 
     public void onClick(View v) { 
      mCamera.takePicture(null, null, mPictureCallback); 
     } 
    }; 

    //public boolean onCreateOptionsMenu(android.view.Menu menu) { 
    // MenuItem item = menu.add(0, 0, 0, "goto gallery"); 
    // item.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { 
    //  public boolean onMenuItemClick(MenuItem item) { 
    //   Uri target = Uri.parse("content://media/external/images/media"); 
    //   Intent intent = new Intent(Intent.ACTION_VIEW, target); 
    //   startActivity(intent); 
    //   return true; 
    //  } 
    // }); 
    // return true; 
    //} 

    @Override 
    protected void onRestoreInstanceState(Bundle savedInstanceState) 
    { 
     super.onRestoreInstanceState(savedInstanceState);   
    } 

    /* 
    * We got the data, send it back to PhoneGap to be handled and processed. 
    * 
    */ 

    // Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
    //  public void onPictureTaken(byte[] data, Camera c) { 
    //   Log.e(TAG, "PICTURE CALLBACK: data.length = " + data.length); 
    //   storeAndExit(data); 

    //  } 
    //}; 

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {   
     public void onPictureTaken(byte[] data, Camera _camera) {       
       storeAndExit(data,_camera); 
       Log.d(TAG, "onPictureTaken - jpeg");        
     } 
     }; 

    /* 
    * We can't just store and exit, because Android freezes up when we try to cram a picture across a process in a Bundle. 
    * We HAVE to compress this data and send back the compressed data 
    */ 
    public void storeAndExit(byte[] data,Camera _camera) 
    {  
      FileOutputStream outStream = null;   
      String fotoName = new String(); 
      try { 
      fotoName="wy"+System.currentTimeMillis(); 
      outStream = new FileOutputStream(String.format(
        "/sdcard/%s.png", fotoName)); 
      outStream.write(data); 
      outStream.close(); 
      Log.e(TAG, "PICTURE CALLBACK: fotoName" + fotoName + "data.length = " + data.length); 
      String js_out = new String("/sdcard/" + fotoName + ".png"); 

      mIntent.putExtra("picture", js_out); 
       //setResult(RESULT_OK, mIntent); 
      this.setResult(RESULT_OK, mIntent); 
     // Uri imageUri = Uri.fromFile(outStream); 
     // storeAndExit(data); 
       finish(); 
      } catch (FileNotFoundException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
      }   
    } 

    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     if (keyCode == KeyEvent.KEYCODE_BACK) {   
      return super.onKeyDown(keyCode, event); 
     } 

     if (keyCode == KeyEvent.KEYCODE_CAMERA || keyCode == KeyEvent.KEYCODE_DPAD_CENTER || keyCode == KeyEvent.KEYCODE_SEARCH) { 
      mCamera.takePicture(null, null, mPictureCallback); 
      return true; 
     } 

     return false; 
    } 

    protected void onResume() 
    { 
     Log.e(TAG, "onResume"); 
     super.onResume(); 
    } 

    protected void onSaveInstanceState(Bundle outState) 
    { 
     super.onSaveInstanceState(outState); 
    } 

    protected void onStop() 
    { 
     Log.e(TAG, "onStop"); 
     super.onStop(); 
    } 

    public void surfaceCreated(SurfaceHolder holder) 
    { 
     Log.e(TAG, "surfaceCreated"); 
     mCamera = Camera.open(); 
     //mCamera.startPreview(); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
    { 
     Log.e(TAG, "surfaceChanged"); 

     // XXX stopPreview() will crash if preview is not running 
     if (mPreviewRunning) { 
      mCamera.stopPreview(); 
     } 

     Camera.Parameters p = mCamera.getParameters(); 
     List<Camera.Size> previewSizes = p.getSupportedPreviewSizes(); 

     Camera.Size previewSize = previewSizes.get(0); 


     p.setPreviewSize(previewSize.width, previewSize.height); 
     mCamera.setParameters(p); 
     try { 
      mCamera.setPreviewDisplay(holder); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     mCamera.startPreview(); 
     mPreviewRunning = true; 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     Log.e(TAG, "surfaceDestroyed"); 
     mCamera.stopPreview(); 
     mPreviewRunning = false; 
     mCamera.release(); 
    } 

    public void onPreviewFrame(byte[] data, Camera camera) { 
     try { 
      Camera.Parameters parameters = camera.getParameters(); 
      Size size = parameters.getPreviewSize(); 
      YuvImage image = new YuvImage(data, parameters.getPreviewFormat(), 
        size.width, size.height, null); 
      File file = new File(Environment.getExternalStorageDirectory() 
        .getPath() + "/out.jpg"); 
      FileOutputStream filecon = new FileOutputStream(file); 
      image.compressToJpeg(
        new Rect(0, 0, image.getWidth(), image.getHeight()), 90, 
        filecon); 
     } catch (FileNotFoundException e) { 
      Toast toast = Toast 
        .makeText(getBaseContext(), e.getMessage(), 1000); 
      toast.show(); 
     } 
    } 


} 

這一個是清單

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.phonegap.CameraPluginTest" 
    android:versionCode="1" 
    android:versionName="1.0" > 

<supports-screens 
    android:largeScreens="true" 
    android:normalScreens="true" 
    android:smallScreens="true" 
    android:resizeable="true" 
    android:anyDensity="true" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.RECEIVE_SMS" /> 
<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
<uses-permission android:name="android.permission.READ_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_CONTACTS" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 
<uses-permission android:name="android.permission.BROADCAST_STICKY" /> 

    <uses-sdk android:minSdkVersion="10" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:debuggable="true" > 
     <activity 
      android:name=".CameraPluginTest2_3Activity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".CameraPreview" 
      android:label="CameraPreviewLabel" 
      android:configChanges="orientation|keyboardHidden" 
      android:screenOrientation="landscape"> 
     </activity>     
    </application> 

</manifest> 

主要問題是我能夠拍攝照片,因此該類的調用正在工作,但onActivityResult是不叫。

你有線索嗎?

非常感謝你,再次抱怨我很抱歉,但我不明白問題在哪裏。

問候

+0

你調試嗎? – Praveenkumar

+0

你檢查過,如果onActivityResult沒有真正調用,或者你的resultCode和/或requestCode與預期的方法不符? – josephus

+0

有一種可能性,如果一切正確。請在超類中放置onActivityResult,即在DroidGap類中使用logcat消息並在此處註釋 –

回答

0

好吧,這是我給你的建議改變你的類CustomCamera擴展插件接口的PhoneGap提供。我們處理本地和JavaScript層之間通信的所有小問題。使用addJavascriptInterface時會彈出一些問題,您需要解決這些問題,包括鍵盤顯示重新載入應用程序,界面在某些版本的模擬器上不起作用等。只需使用我們的插件API即可對你來說容易得多。

How to create a Plugin for Android

看看我們的PhoneGap Camera code的src,因爲我們只是推出針對Android的拍照目的,你可以使用相同的方法,但發動你的意圖來代替。

+0

非常感謝,我會嘗試這種方法。 – Gusa

4

看到你的回答你的問題..你可以得到你的活動回來的插件的方法是確保:

this.cordova.setActivityResultCallback(MyActivity.this); 

叫你做startActivityForResult()之前..打電話。 真的讓我感到困擾,似乎沒有人在任何地方回答過。必須自己找出來。

SF

+0

這是什麼「MyActivity」?如果它是一個Android Activity,那麼'void org.apache.cordova.CordovaInterface.setActivityResultCallback(CordovaPlugin arg0)',該方法採用CordovaPlugin arg。在哪個java文件中,我必須調用此方法,因爲Android Activity沒有'cordova'實例來調用此.cordova。 –

0

我無法得到onActivityResult工作,直到我已經改變launchMode在AndroidManifest.xml

這一個是不工作

android:launchMode="singleInstance" 

標準singleTop適合我。

我發現你的清單中沒有launchMode,所以我不確定它會對你的情況有所幫助。但我希望這可以幫助其他任何人解決這個問題。

1

如果您在您的主要活動onActivityResult(),你必須確保它調用它的父的方法來正確地處理插件:

public class MainActivity extends CordovaActivity { 
        //or 'extends DroidGap' based on Cordova version 

    //... 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
      if (requestCode == MyCustomActivity) { 
        doMyCustomActivity(requestCode); 
      } 
      else { //call onActivityResult() of the plugins 
       super.onActivityResult(requestCode, resultCode, intent); 
      } 
    } 

    //... 
}