Visualizzazione stampabile
-
Ciao,
ho fatto un po di modifiche, prova a testarlo. MappaActivity dovrebbe andare bene così.
codice:
public class FotoActivity extends Activity implements SurfaceHolder.Callback{
ProgressDialog pd;
Intent iFoto;
String utente, via, citta;
Camera mCamera;
SurfaceView mSurfaceView;
SurfaceHolder mSurfaceHolder;
File foto;
boolean mPreviewRunning;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.mod_foto);
// Prelevo l'id utente da MappaActivity
iFoto = getIntent();
String pkg = getPackageName();
utente = iFoto.getStringExtra(pkg+".utente");
via = iFoto.getStringExtra(pkg+".via");
citta = iFoto.getStringExtra(pkg+".citta");
// SCATTA FOTO
Button buttonPicture = (Button) findViewById(R.id.camera_surface_button);
buttonPicture.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
mCamera.takePicture(shutterCallback, rawCallback, jpegCallback);
}
});
mSurfaceView = (SurfaceView)findViewById(R.id.camera_surface);
mSurfaceView.setClickable(true);
mSurfaceHolder = mSurfaceView.getHolder(); //recupero l'holder della surfaceview
mSurfaceHolder.addCallback(this); //faccio la bind alla nostra activity
mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); //tipo di surface, suggerito nei tutorial ufficiali
pd = null;
}
@Override
public void onPause(){
super.onPause();
if(pd != null)
pd.dismiss();
}
ShutterCallback shutterCallback = new ShutterCallback() {
public void onShutter() {
Log.d("TAG", "onShutter'd");
}
};
PictureCallback rawCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.d("TAG", "onPictureTaken - raw");
}
};
PictureCallback jpegCallback = new PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
String nomeFoto;
FileOutputStream outStream = null;
try {
nomeFoto = String.valueOf(System.currentTimeMillis()) + ".jpg";
foto = new File(getExternalCacheDir(), nomeFoto);
outStream = new FileOutputStream(foto);
outStream.write(data);
outStream.close();
// creo e avvio asynctask per scattare la foto
FotoGetTask task = new FotoGetTask();
task.execute("");
Log.d("TAG", "onPictureTaken - wrote bytes: " + data.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
}
Log.d("TAG", "onPictureTaken - jpeg");
}
};
public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
if (mPreviewRunning)
mCamera.stopPreview();
//setto le preferenze
Camera.Parameters p = mCamera.getParameters(); //prendo le preferenze della camera
p.setPreviewSize(arg2, arg3);
ArrayList<Size> list = (ArrayList<Size>) p.getSupportedPictureSizes(); //recupero le risoluzioni supportate dalla camera
int picture_width = list.get(list.size()-1).width;
int picture_height = list.get(list.size()-1).height;
p.setPictureSize(picture_width, picture_height); //setto la camera alla risoluzione più bassa
p.setJpegQuality(50); // qualità compressione JPEG
p.setFlashMode("on");
p.setFocusMode("auto");
// salvo le pref
mCamera.setParameters(p);
try {
//lancio la preview
mCamera.setPreviewDisplay(arg0);
mCamera.startPreview();
mPreviewRunning = true;
} catch (IOException e) {
//gestione errore
}
}
public void surfaceCreated(SurfaceHolder holder) {
if (mCamera == null) {
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
mCamera.release();
mCamera = null;
}
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
iFoto.putExtra("pFoto", "");
iFoto.putExtra("pUtente",utente);
iFoto.putExtra("pVia",via);
iFoto.putExtra("pCitta",citta);
setResult(RESULT_CANCELED,iFoto);
if (mCamera != null) {
mCamera.stopPreview();
mCamera.setPreviewCallback(null);
mCamera.release();
mCamera = null;
}
finish();
}
private class FotoGetTask extends AsyncTask<String,String,String> {
@Override
protected void onPreExecute(){
pd = ProgressDialog.show(FotoActivity.this,"Foto","CanFoto = ricamento in corso...",true,false);
}
protected String doInBackground(String... params) {
String nomeFoto = "";
for(int i=0;i<params.length;i++){
nomeFoto += params[i];
}
//Upload del file verso il server ftp
FTPClient client = new FTPClient();
try {
InetAddress indirizzo = InetAddress.getByName("www.miodominio.it");
client.connect(indirizzo);
//aperta la connessione al server procedo al login
boolean loggato = client.login("mio@dominio.it", "miapwd");
//apro il file contenuto nel path /sdcard come stream
client.setFileType(FTP.BINARY_FILE_TYPE); // imposto il tipo di dati, da modificare a seconda dell'utilità
//File sdcardDir = Environment.getExternalStorageDirectory(); //prendo il riferimento alla memoria esterna
//File file = new File(sdcardDir, nomeFoto + ".jpg"); //prendo il riferimento al file salvato sulla sd
FileInputStream fis = new FileInputStream(foto); //creo uno stream in input a partire dal mio file
boolean upload_ok = client.storeFile("/miodominio.it/img/"+ nomeFoto, fis);
fis.close(); //procedo alla chiusura dello stream, infatti storeFile non chiude fis
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
return nomeFoto;
}
//return nomeFoto;
}
@Override
protected void onPostExecute(String nomeFoto) {
pd.dismiss();
if (nomeFoto.equals("")){
Toast.makeText(FotoActivity.this, "Connessione dati assente", Toast.LENGTH_LONG).show();
iFoto.putExtra("pFoto", nomeFoto);
iFoto.putExtra("pUtente",utente);
iFoto.putExtra("pVia",via);
iFoto.putExtra("pCitta",citta);
setResult(RESULT_CANCELED,iFoto);
finish();
}else{
iFoto.putExtra("pFoto", nomeFoto);
iFoto.putExtra("pUtente",utente);
iFoto.putExtra("pVia",via);
iFoto.putExtra("pCitta",citta);
setResult(RESULT_OK,iFoto);
Toast.makeText(FotoActivity.this, "Foto caricata con successo!", Toast.LENGTH_LONG).show();
finish();
}
}
}
}
-
Niente da fare. :(
L'errore non cambia:
codice:
E/AndroidRuntime(22440): FATAL EXCEPTION: main
E/AndroidRuntime(22440): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=0, data=null} to activity {
it.tesi/it.tesi.MappaActivity}: java.lang.NullPointerException
E/AndroidRuntime(22440): at android.app.ActivityThread.deliverResults(ActivityThread.java:3205)
E/AndroidRuntime(22440): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3248)
E/AndroidRuntime(22440): at android.app.ActivityThread.access$1200(ActivityThread.java:140)
E/AndroidRuntime(22440): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
E/AndroidRuntime(22440): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(22440): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(22440): at android.app.ActivityThread.main(ActivityThread.java:4921)
E/AndroidRuntime(22440): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(22440): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(22440): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
E/AndroidRuntime(22440): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
E/AndroidRuntime(22440): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(22440): Caused by: java.lang.NullPointerException
E/AndroidRuntime(22440): at it.tesi.MappaActivity.onActivityResult(MappaV2Activity.java:905)
E/AndroidRuntime(22440): at android.app.Activity.dispatchActivityResult(Activity.java:5390)
E/AndroidRuntime(22440): at android.app.ActivityThread.deliverResults(ActivityThread.java:3201)
E/AndroidRuntime(22440): ... 11 more
-
Potresti provare facendo l'ovveride del tasto "back". All'interno di quello gestisci tu la situazione nel momento in cui viene cliccato il tasto back. Puoi pure dirgli che se viene cliccato "Back" lui non deve fare niente!