2012-06-06 2 views
1

Прошу прощения за то же самое, но после поиска ответа у меня не было кода, который работает правильно.Android onActivityResult никогда не запускается

NThis является основной функцией которой я называю активность:

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-интерфейс Plugin, поскольку он будет будет намного легче для вас.

How to create a Plugin for Android

Посмотрите на ГКЗ в PhoneGap нашего Camera code как мы просто запустить картину принимая намерение для Android, и вы можете использовать тот же подход, но начать свое намерение вместо этого.

+0

Большое спасибо, я постараюсь с этим подходом. – Gusa

4

Видел ваш ответ на вашу проблему .. Как вы можете получить активность вернуться к вилке в, чтобы убедиться, что:

this.cordova.setActivityResultCallback(MyActivity.this); 

вызывается, прежде чем сделать startActivityForResult() .. . вызов. Что-то, что действительно беспокоило меня, что никто, казалось, нигде не ответил. Я должен был найти это для себя.

SF

+0

Что это за «MyActivity»? Если это действие Android, то 'void org.apache.cordova.CordovaInterface.setActivityResultCallback (CordovaPlugin arg0)', метод принимает аргумент CordovaPlugin. В каком java-файле я должен вызвать этот метод, так как в Android Activity нет экземпляра 'cordova' для вызова this.cordova. –

0

Я не мог получить onActivityResult работать, пока я не изменить launchMode в AndroidManifest.xml

Это один не работает:

android:launchMode="singleInstance" 

стандарт и singleTop работал отлично.

Я вижу, что в вашем манифеста нет режима запуска, поэтому я не уверен, что это поможет в вашем случае. Но я надеюсь, что это может помочь кому-то еще застрять в этом вопросе.

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

    //... 
} 
Смежные вопросы