Autore Topic: Null Point Exeption Lancio Intent per Image Crop&Capture  (Letto 1011 volte)

Offline Gigsultamigi

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    windows 7
Null Point Exeption Lancio Intent per Image Crop&Capture
« il: 21 Gennaio 2013, 22:12:27 CET »
0
Premetto che ho iniziato da poco con android.
Spiego velocemente la mia esigenza:
In pratica sto sviluppando un app che deve prelevare un immagine da gallery o da camera e nel caso in cui l'immagine fosse troppo grande farne il crop.
Posto la mia classe:
Codice (Java): [Seleziona]
package com.example.frasiimprobabili;


import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ImageView;

public class frasi extends Activity implements OnClickListener,OnItemSelectedListener{
        private static final int GALLERY = 1;
        private static final int CAMERA = 2;
        private static final int CROP = 3;
        Uri selectedImage;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_frasi);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.activity_frasi, menu);
                ImageView imgGall = (ImageView) findViewById(R.id.imgCamera);
        ImageView imgCame = (ImageView) findViewById(R.id.imgGallery);
        imgGall.setOnClickListener(this);
        imgCame.setOnClickListener(this);
                return true;
        }

        @Override
        public void onClick(View v) {
                System.err.println("Quale?");
                if(v.getId()==R.id.imgGallery){
                        System.err.println("Passato da qui");
                        Intent gallery = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                        startActivityForResult(gallery, GALLERY);      
                }else{
                        if(v.getId()==R.id.imgCamera){
                                Intent i = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
                startActivityForResult( i, CAMERA );
                        }
                }
               
        }
   
        @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
     
      selectedImage = data.getData();
      String path=getPath(selectedImage);
      ImageView imgView = (ImageView)findViewById(R.id.imagecit);
      Bitmap bitmapImage=BitmapFactory.decodeFile(path);
     
      if(resultCode==RESULT_OK){
          switch(requestCode){
          case CAMERA:
                  System.err.println("Sono in camera");
                  if(bitmapImage.getHeight() > 150 || bitmapImage.getWidth() > 130){
                          doCrop();
                  }else{
                          imgView.setImageBitmap(bitmapImage);
                  }
          break;
          case GALLERY:
                  System.err.println("Sono in galleria");
                  if(bitmapImage.getHeight() > 150 || bitmapImage.getWidth() > 130){
                          doCrop();
                  }else{
                          imgView.setImageBitmap(bitmapImage);
                  }
          break;
          case CROP:
                  System.err.println("Sono in CROP");
              /*Bundle extra = data.getExtras();
              Bitmap thePic = extra.getParcelable("data");     
                  imgView.setImageBitmap(thePic);*/

          break;
          }
      }
    }

    public void doCrop(){
        System.err.println("Sono in CROP - metodo");
           Intent cropIntent = new Intent("com.android.camera.action.CROP");
           cropIntent.setDataAndType(selectedImage, "image/*");
           cropIntent.putExtra("crop", "true");
           cropIntent.putExtra("aspectX", 1);
           cropIntent.putExtra("aspectY", 1);
           cropIntent.putExtra("outputX", 130);
           cropIntent.putExtra("outputY", 150);
           cropIntent.putExtra("return-data", true);
           startActivityForResult(cropIntent, CROP);
    }
   
        public String getPath(Uri uri){
              String[] filePathColumn={MediaStore.Images.Media.DATA};

              Cursor cursor=getContentResolver().query(uri, filePathColumn, null, null, null);
              cursor.moveToFirst();
              int columnIndex=cursor.getColumnIndex(filePathColumn[0]);

              return cursor.getString(columnIndex);
            }
       
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                        long arg3) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub
               
        }

}

Al momento ricevo un nullpointexception quando ritorno dall'intent del crop.
Di seguito il logcat:

01-21 22:11:17.908: E/AndroidRuntime(10415): FATAL EXCEPTION: main
01-21 22:11:17.908: E/AndroidRuntime(10415): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=3, result=-1, data=Intent { (has extras) }} to activity {com.example.frasiimprobabili/com.example.frasiimprobabili.frasi}: java.lang.NullPointerException
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3205)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3248)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.ActivityThread.access$1200(ActivityThread.java:140)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.os.Looper.loop(Looper.java:137)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.ActivityThread.main(ActivityThread.java:4921)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at java.lang.reflect.Method.invokeNative(Native Method)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at java.lang.reflect.Method.invoke(Method.java:511)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at dalvik.system.NativeStart.main(Native Method)
01-21 22:11:17.908: E/AndroidRuntime(10415): Caused by: java.lang.NullPointerException
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1096)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.content.ContentResolver.query(ContentResolver.java:356)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.content.ContentResolver.query(ContentResolver.java:315)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at com.example.frasiimprobabili.frasi.getPath(frasi.java:111)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at com.example.frasiimprobabili.frasi.onActivityResult(frasi.java:63)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.Activity.dispatchActivityResult(Activity.java:5390)
01-21 22:11:17.908: E/AndroidRuntime(10415):    at android.app.ActivityThread.deliverResults(ActivityThread.java:3201)
01-21 22:11:17.908: E/AndroidRuntime(10415):    ... 11 more

Spero possiate aiutarmi.
Grazie.
« Ultima modifica: 21 Gennaio 2013, 22:15:05 CET da Gigsultamigi »

Offline Gigsultamigi

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    windows 7
Re:Null Point Exeption Lancio Intent per Image Crop&Capture
« Risposta #1 il: 21 Gennaio 2013, 23:32:05 CET »
0
La nuova classe:
Codice (Java): [Seleziona]
package com.example.frasiimprobabili;


import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ImageView;

public class frasi extends Activity implements OnClickListener,OnItemSelectedListener{
        private static final int GALLERY = 1;
        private static final int CAMERA = 2;
        private static final int CROP = 3;
        Uri selectedImage;
       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_frasi);
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.activity_frasi, menu);
                ImageView imgGall = (ImageView) findViewById(R.id.imgCamera);
        ImageView imgCame = (ImageView) findViewById(R.id.imgGallery);
        imgGall.setOnClickListener(this);
        imgCame.setOnClickListener(this);
                return true;
        }

        @Override
        public void onClick(View v) {
                System.err.println("Quale?");
                if(v.getId()==R.id.imgGallery){
                        System.err.println("Passato da qui");
                        Intent gallery = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI);
                        startActivityForResult(gallery, GALLERY);      
                }else{
                        if(v.getId()==R.id.imgCamera){
                                Intent i = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
                startActivityForResult( i, CAMERA );
                        }
                }
               
        }
   
        @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
     
      String path;
      ImageView imgView;
      Bitmap bitmapImage =null;
      imgView = null;
     
      if(data!=null){
      if(requestCode != CROP){
          selectedImage = data.getData();
          path=getPath(selectedImage);
          imgView = (ImageView)findViewById(R.id.imagecit);
          bitmapImage=BitmapFactory.decodeFile(path);
      }
      if(resultCode==RESULT_OK){
          switch(requestCode){
          case CAMERA:
                  System.err.println("Sono in camera");
                  if(bitmapImage.getHeight() > 150 || bitmapImage.getWidth() > 130){
                          doCrop();
                  }else{
                          imgView.setImageBitmap(bitmapImage);
                  }
          break;
          case GALLERY:
                  System.err.println("Sono in galleria");
                  if(bitmapImage.getHeight() > 150 || bitmapImage.getWidth() > 130){
                          doCrop();
                  }else{
                          imgView.setImageBitmap(bitmapImage);
                  }
          break;
          case CROP:
                  System.err.println("Sono in CROP");
              Bundle extra = data.getExtras();
              Bitmap thePic = (Bitmap) extra.get("data");
              if (thePic != null) {
                  imgView = (ImageView)findViewById(R.id.imagecit);
                  imgView.setImageBitmap(thePic);
                  imgView.invalidate();
              }
             
          break;
          }
      }
      }
    }

    public void doCrop(){
        System.err.println("Sono in CROP - metodo");
           Intent cropIntent = new Intent("com.android.camera.action.CROP");
           cropIntent.setDataAndType(selectedImage, "image/*");
           cropIntent.putExtra("crop", "true");
           cropIntent.putExtra("aspectX", 1);
           cropIntent.putExtra("aspectY", 1);
           cropIntent.putExtra("outputX", 130);
           cropIntent.putExtra("outputY", 150);
           cropIntent.putExtra("return-data", true);
           startActivityForResult(cropIntent, CROP);
    }
   
        public String getPath(Uri uri){
              String[] filePathColumn={MediaStore.Images.Media.DATA};

              Cursor cursor=getContentResolver().query(uri, filePathColumn, null, null, null);
              cursor.moveToFirst();
              int columnIndex=cursor.getColumnIndex(filePathColumn[0]);

              return cursor.getString(columnIndex);
            }
       
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                        long arg3) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
                // TODO Auto-generated method stub
               
        }

}

C'erano alcuni errori nella logica.
Grazie.

Offline Gigsultamigi

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    windows 7
Re:Null Point Exeption Lancio Intent per Image Crop&Capture
« Risposta #2 il: 22 Gennaio 2013, 00:55:58 CET »
0
Avete idea di come passare un'immagine di tipo Bitmap tra 2 activity?  O:-)

Offline Gigsultamigi

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    windows 7
Re:Null Point Exeption Lancio Intent per Image Crop&Capture
« Risposta #3 il: 22 Gennaio 2013, 13:01:44 CET »
0
Qualcuno mi aiuta?

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Null Point Exeption Lancio Intent per Image Crop&Capture
« Risposta #4 il: 22 Gennaio 2013, 13:23:59 CET »
+1
Qualcuno mi aiuta?
Attraverso gli extra dell'intent. Bitmap è implementa Parcelable, è un'operazione lecita.

Quindi nella seconda activity lanciata con startActivityForResult quando ritorni fai:
Codice (Java): [Seleziona]
Intent returnIntent = new Intent();
returnIntent.putExtra("IMG", myBitmap);
setResult(RESULT_OK,returnIntent);    
finish();

E nella chiamante:
Codice (Java): [Seleziona]
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);    
      Bitmap bitmapImage = null;
      if(resultCode == RESULT_OK){
        bitmapImage = (Bitmap)data.getParcelableExtra("IMG");
  //...

Offline Gigsultamigi

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Sistema operativo:
    windows 7
Re:Null Point Exeption Lancio Intent per Image Crop&Capture
« Risposta #5 il: 22 Gennaio 2013, 14:15:19 CET »
0
Grande Parceable!!!!!  :D :D :D :D :D
In effetti non avevo bisogno di implementare OnActivityResult, ma il tuo aiuto è stato molto utile.