2015-02-11 5 views
8

Ho usato Navigation drawer in ciascun articolo, fare clic su ho chiamato Fragments così in un articolo ho chiamato uno Fragment in questo frammento ho bisogno di ottenere un'immagine dalla fotocamera e impostarlo come canvas background. In questo ho catturato l'immagine della fotocamera ma non so come ottenere questa immagine dopo averla catturata e averla impostata sullo sfondo della tela.come ottenere risultati da onActivityResult in Fragment?

frammento di codice

import android.content.ContentValues; 
import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v4.app.Fragment; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.ImageButton; 
import android.widget.LinearLayout; 
import android.widget.Toast; 

import com.ssoft.admin.code.SharedPreferenceStore; 
import com.ssoft.admin.code.Tools; 
import com.ssoft.admin.salesmateco.FragSiteInspectionAdditional; 
import com.ssoft.admin.salesmateco.R; 

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 
public class FragSignature extends Fragment implements View.OnClickListener { 
    Button mSIBtnCamera; 
    Fragment fragment; 
    Tools mTools; 
    private static final int RESULT_OK = 1; 
    private static final int RESULT_CANCELED = 0; 
    Uri imageUri = null; 
    final int CAMERA_DATA = 100, INTENT_DATA = 1; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View rootView = inflater.inflate(
       R.layout.frag_site_inspection_signature, null); 
     mSIBtnCamera = (Button) rootView.findViewById(R.id.camera); 
     mSIBtnCamera.setOnClickListener(this); 

     return rootView; 
    } 

    @Override 
    public void onClick(View v) { 
     if (v.getId() == R.id.camera) { 
      captureImage(); 
     } 

     else { 
      Toast.makeText(getActivity().getApplicationContext(), 
        "FragSIPhotos Add Button OnClick", Toast.LENGTH_SHORT) 
        .show(); 

     } 
    } 

    public void captureImage() { 
     // Define the file-name to save photo taken by Camera activity 

     String fileName = "Images.jpg"; 

     // Create parameters for Intent with filename 

     ContentValues values = new ContentValues(); 

     values.put(MediaStore.Images.Media.TITLE, fileName); 

     values.put(MediaStore.Images.Media.DESCRIPTION, 
       "Image capture by camera"); 

     // imageUri is the current activity attribute, define and save it for 
     // later usage 

     Uri imageUri = getActivity().getApplicationContext() 
       .getContentResolver() 
       .insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 

     /**** 
     * EXTERNAL_CONTENT_URI : style URI for the "primary" external storage 
     * volume. 
     ****/ 

     // Standard Intent action that can be sent to have the camera 
     // application capture an image and return it. 

     Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

     intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); 

     intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, INTENT_DATA); 
     Log.e("captureImage()", "state -1"); 
     getActivity().startActivityForResult(intent, CAMERA_DATA); 
     Log.e("captureImage()", "end"); 

    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     Log.e("OnActivityResult()", "1"); 

     if (requestCode == CAMERA_DATA) { 
      Log.e("OnActivityResult()", "2"); 

      if (resultCode == RESULT_OK) { 
       // Image captured and saved to fileUri specified in the Intent 
       Log.e("OnActivityResult()", "3"); 
      } else if (resultCode == RESULT_CANCELED) { 
       // User cancelled the image capture 
       Log.e("OnActivityResult()", "4"); 
      } else { 
       // Image capture failed, advise user 
       Log.e("OnActivityResult()", "5"); 
      } 
     } 
     Log.e("OnActivityResult()", "6"); 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.e("OnActivityResult()", "7"); 
    } 

} 
+1

leggere questo http://stackoverflow.com/questions/5991319/capture-image-from-camera-and-display-in-activity – upenpat

+0

ma nel mio progetto il cursore non entra nel metodo onActivityResult(). –

+0

Assicurarsi di aver eseguito override suActivityResult nell'attività padre del frammento ed effettuare una chiamata a 'super.onActivityResult (requestCode, resultCode, data);' nell'attività. Se non lo fai, i frammenti suActivityResult() non vengono mai chiamati. –

risposta

0

onActivityResult dovrebbe essere attuato in Attività, questa classe è la tua Fragment.
Applicare onActivityResult all'interno di FragmentActivity.

+0

non ho FragmentActivity ho ActionBarActivity in cui ho usato EspandibileNavigationDrawer nel cassetto di navigazione un elemento secondario apre questo frammento e ottiene l'immagine e memorizzato. –

+0

Usa l'attività, qualsiasi tipo di attività che stai utilizzando. È possibile implementare all'interno di ActionBarActivity. –

4

Sostituire

getActivity().startActivityForResult(intent, CAMERA_DATA); 

con

startActivityForResult(intent, CAMERA_DATA); 
+0

grazie mr.Ramesh il suo funzionamento prima ho usato questo, ma a quel tempo questo metodo in sottoclass. –

+0

in onActionResult() ir genera NullPointerException. –

+0

in onActivityResult()? – Ramesh

16

In Classe di attività:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 

    super.onActivityResult(requestCode,resultCode,data); 

} 

In Frammento:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data){} 

Opzione 1:

Se stai chiamando startActivityForResult() dal frammento allora si dovrebbe chiamare startActivityForResult() non getActivity().startActivityForResult(), in quanto si tradurrà in frammento onActivityResult().

Se non sei sicuro di dove stai chiamando su startActivityForResult() e come chiamerai i metodi.

Opzione 2:

Poiché l'attività ottiene il risultato di onActivityResult(), è necessario sostituire l'attività del onActivityResult() e chiamare super.onActivityResult() per propagare al rispettivo frammento per i codici risultati non gestite o per tutti.

Se le 2 opzioni sopra indicate non funzionano, consultare l'opzione 3 poiché funzionerà sicuramente.

Opzione 3:

chiamata esplicita dal frammento onActivityResult funzione come segue

In Parent Classe di attività, l'override del metodo onActivityResult() e anche sovrascrivere lo stesso in Frammento di classe e chiamare come il seguente codice.

in attività:

@Override protetta onActivityResult void (int requestCode, int resultCode, dati intenti) { Fragment frammento = getSupportFragmentManager() findFragmentById ("yourFragment");. frammento.onActivityResult (requestCode, resultCode, data); }

In Frammento:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    //in fragment class callback 
} 
+0

Grazie per il tuo suggerimento, ma ho usato ActionBarActivity non utilizzato FragmentActivity, quindi proverò il tuo suggerimento ma getterà anche NullPointerException. –

+0

devi chiamare StartActivityForResult() invece di getActivity(). StartActivityforResult() nel tuo frammento per la soluzione precedente per funzionare correttamente, fammi sapere se stai ancora affrontando questo problema. –

+0

sopra 3 soluzione mi piacerebbe provare ma non ha funzionato .. –