2017-08-17 4 views
-1

Je suis nouveau sur Android et j'espère que je peux trouver une solution ici. Sur mon activité, je peux prendre une photo et la sélectionner dans la galerie. Après avoir appuyé sur le bouton Enregistrer l'application devrait enregistrer l'image dans la base de données. Mais tout ce que je reçois est l'erreur suivante:Android - App s'écrase en essayant d'enregistrer l'image

08-17 22:52:41.326 2683-2697/android.process.media E/DatabaseUtils: Writing exception to parcel 
                    java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media/35 from pid=4424, uid=10060 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission() 
                     at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605) 
                     at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480) 
                     at android.content.ContentProvider$Transport.enforceFilePermission(ContentProvider.java:471) 
                     at android.content.ContentProvider$Transport.openTypedAssetFile(ContentProvider.java:416) 
                     at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:313) 
                     at android.os.Binder.execTransact(Binder.java:453) 

08-17 22:42:31.929 4290-4290/com.group6.travlhoe E/AndroidRuntime: FATAL EXCEPTION: main 
                    Process: com.group6.travlhoe, PID: 4290 
                    java.lang.NullPointerException: Attempt to invoke virtual method 'android.graphics.Bitmap android.graphics.drawable.BitmapDrawable.getBitmap()' on a null object reference 
                     at com.group6.TakeOff.activity_unterkunft.imageViewToByte(activity_unterkunft.java:187) 
                     at com.group6.TakeOff.activity_unterkunft$3.onClick(activity_unterkunft.java:205) 
                     at android.view.View.performClick(View.java:5198) 
                     at android.view.View$PerformClick.run(View.java:21147) 
                     at android.os.Handler.handleCallback(Handler.java:739) 
                     at android.os.Handler.dispatchMessage(Handler.java:95) 
                     at android.os.Looper.loop(Looper.java:148) 
                     at android.app.ActivityThread.main(ActivityThread.java:5417) 
                     at java.lang.reflect.Method.invoke(Native Method) 
                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

Mon code Java: activity_unterkunft public class étend AppCompatActivity {

DatabaseHelper myDb; 
    Button btn_save; 
    Spinner ChooseProject; 
    EditText Entfernung,Price,MWST; 
    String selectedspinner; 

    ImageView imageView6; 
    private static int PICK_IMAGE = 100; 
    Uri imageUri; 


    private BottomNavigationViewEx bottomNavigationViewEx; 

    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2) 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_unterkunft); 
     myDb = new DatabaseHelper(this); 

     ChooseProject = (Spinner) findViewById(R.id.ChooseProject); 
     Entfernung = (EditText) findViewById(R.id.Entfernung); 
     Price = (EditText) findViewById(R.id.Preis); 
     MWST = (EditText) findViewById(R.id.MwSt); 
     btn_save=(Button) findViewById(R.id.btn_save); 

     ImageButton btnCamera= (ImageButton)findViewById(R.id.btnCamera); 
     imageView6=(ImageView) findViewById(R.id.imageView6); 

     loadSpinnerData(); 
     SaveData(); 

     //CameraInitialisierung 
     StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); 
     StrictMode.setVmPolicy(builder.build()); 
     builder.detectFileUriExposure(); 

     //++++++++++++BOTTOM NAVIGATION BAR++++++++++++// 
     bottomNavigationViewEx = (BottomNavigationViewEx) findViewById(R.id.bottomNavigationView); 

     bottomNavigationViewEx.setOnNavigationItemSelectedListener(new BottomNavigationViewEx.OnNavigationItemSelectedListener(){ 
      @Override 
      public boolean onNavigationItemSelected(@NonNull MenuItem item){ 
       if (item.getItemId()==R.id.menu_start){ 
        startActivity(new Intent(activity_unterkunft.this, MainActivity.class)); 
       } else if(item.getItemId()==R.id.menu_allgemein){ 
        startActivity(new Intent(activity_unterkunft.this, activity_allgemein.class)); 
       } else if(item.getItemId()==R.id.menu_transport){ 
        startActivity(new Intent(activity_unterkunft.this, activity_transport.class)); 
       } else if(item.getItemId()==R.id.menu_rechnung){ 
        startActivity(new Intent(activity_unterkunft.this, activity_rechnung.class)); 
       } else if(item.getItemId()==R.id.menu_unterkunft){ 
        startActivity(new Intent(activity_unterkunft.this, activity_unterkunft.class)); 
       } 
       return true; 
      } 
     }); 

     bottomNavigationViewEx.setSelectedItemId(R.id.menu_unterkunft); 
     BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx); 
    } 
    public void onButtonClicked(View v){ 
     if(v.getId()==R.id.btnCamera) { 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

      File pictureDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
      String pictureName= getPictureName(); 
      File imageFile= new File(pictureDirectory,pictureName); 

      //URI weil putExtra sonst nicht mit File elementen klar kommt! 
      Uri pictureUri = Uri.fromFile(imageFile); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri); 

      startActivityForResult(intent, 0); 
     } 
     if(v.getId()==R.id.goToGPS) { 
      //Intent intent2 = new Intent(activity_unterkunft.this, function_gps.class); 
      Intent intent2 = new Intent(activity_unterkunft.this, MapsActivity.class); 
      startActivity(intent2); 
     } 
     if(v.getId()==R.id.btnGallery){ 
      openGallery(); 
     } 
    } 

    private void openGallery() { 
     Intent Gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(Gallery, PICK_IMAGE); 
    } 

    private String getPictureName() { 
     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss"); 
     String timestamp = sdf.format(new Date()); 
     return "Rechnung"+ timestamp + ".jpg"; 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(resultCode==RESULT_OK && requestCode==PICK_IMAGE){ 
      imageUri= data.getData(); 
      imageView6.setImageURI(imageUri); 
     } 

     // Bitmap bitmap = (Bitmap)data.getExtras().get("data"); 

     //imageView.setImageBitmap(bitmap); 
    } 



    /** 
    * Function to load the spinner data from SQLite database 
    * */ 
    private void loadSpinnerData() { 
     // database handler 
     DatabaseHelper db = new DatabaseHelper (getApplicationContext()); 

     // Spinner Drop down elements 
     List<String> projects = db.getAllProjects(); 

     // Creating adapter for spinner 
     ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_spinner_item, projects); 

     // Drop down layout style - list view with radio button 
     dataAdapter 
       .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     ChooseProject.setPrompt("Projekt auswählen"); 

     // attaching data adapter to spinner 
     ChooseProject.setAdapter(dataAdapter); 

     //Listener für den Spinner damit ich den Wert abspeichern kann 
     ChooseProject.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 
       //selectedspinner =String.ValueOf(parent.getItemAtPosition(pos)); 
       selectedspinner = (String) ChooseProject.getSelectedItem(); 
      } 
      public void onNothingSelected(AdapterView<?> parent) { 
      } 
     }); 


    } 

    public static byte[] imageViewToByte(ImageView image) { 
     Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap(); 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream); 
     byte[] byteArray = stream.toByteArray(); 
     return byteArray; 
    } 

    //++++++++++++Save Data++++++// 
    public void SaveData(){ 
     btn_save.setOnClickListener(
     new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         boolean isInserted = myDb.createUnterkunft(
           selectedspinner, 
           Integer.valueOf(Price.getText().toString()), 
           Integer.valueOf(MWST.getText().toString()), 
           Integer.valueOf(Entfernung.getText().toString()), 
           imageViewToByte(imageView6) 
         ); 
         if(isInserted=true) 
          Toast.makeText(activity_unterkunft.this, "Daten gespeichert", Toast.LENGTH_LONG).show(); 
         else 
          Toast.makeText(activity_unterkunft.this, "Daten nicht gespeichert", Toast.LENGTH_LONG).show(); 

        } 
       } 
     ); 
    } 
} 

La méthode correspondante dans mon DB-Helper:

//+++++++++++++CREATE A UNTERKUNFT++++++++++++// 
    public boolean createUnterkunft(String project, int price, int steuer, int entfernung, byte [] image){ 
     SQLiteDatabase db = this.getWritableDatabase(); 
     ContentValues contentValues = new ContentValues(); 
     contentValues.put(KEY_PROJECT, project); 
     contentValues.put(KEY_PRICE, price); 
     contentValues.put(KEY_MWST, steuer); 
     contentValues.put(KEY_ENTFERNUNG, entfernung); 
     contentValues.put(KEY_RECHNUNG_IMG, image); 
     long result = db.insert(TABLE_UNTERKUNFT,null,contentValues); 
     if(result == -1) 
      return false; 
     else 
      return true; 

    } 

J'espère que quelqu'un peut m'aider avec ce problème.

+1

'(BitmapDrawable) image.getDrawable()' renvoie 'null'. Vous devrez peut-être jeter un oeil à votre méthode 'myDb.createUnterkunft' – GuilhermeFGL

+0

mais qu'est-ce que cela signifie? – Stelios

+0

j'ai oublié d'ajouter la première partie du message d'erreur – Stelios

Répondre