2016-12-15 5 views
0

Meine App nimmt ein Bild von der Kamera auf und zeigt es einer anderen Aktivität an. Außerdem müssen Daten von Firebase gespeichert und abgerufen werden.Wie kann ich verhindern, dass meine App nach der Kameraaufnahme abstürzt?

Aber App stürzt ab, nachdem das Bild aufgenommen wurde und klicken Sie auf OK von der Kamera. Auch gibt es keine Protokoll Katze Ausnahme ich bekomme. Was ist zu tun? // Unten ist die Aktivität in dem die Kamera aufgerufen wird:

HomeActivity.java

public class HomeActivity extends AppCompatActivity { 

    private SectionsPagerAdapter mSectionsPagerAdapter; 
    private static final int CAMERA_REQUEST = 1888; 
    private ViewPager mViewPager; 
    private File imageFile; 
    private Uri imageUri; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_home); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.container); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(mViewPager); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
     fab.setOnClickListener(new View.OnClickListener() { 

      String timeStamp= new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
      String imageFileName="IMAGE_"+timeStamp+"_"; 

      //Adding Camera Intent when clicked on the FAB 
      @Override 
      public void onClick(View view) { 
       Intent cameraIntent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
       startActivityForResult(cameraIntent,CAMERA_REQUEST); 
      } 
     }); 
    } 

    //What Happens After the Image is Captured 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(requestCode==CAMERA_REQUEST && resultCode==Activity.RESULT_OK){ 
       Toast.makeText(this,"File saved to"+imageFile.getAbsolutePath(),Toast.LENGTH_LONG).show(); 
       Intent intent=new Intent(HomeActivity.this,PostActivity.class); 
       Bitmap photo = (Bitmap) data.getExtras().get("data"); 
       Uri uri=data.getData(); 
       intent.putExtra("EXTRA_VALUE",photo); 
       intent.setData(uri); 
       startActivity(intent); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_home, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 

SectionsPagerAdapter.java

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position){ 
      case 0: 
       AllPosts allposts=new AllPosts(); 
       return allposts; 
      case 1: 
       MyPosts myposts=new MyPosts(); 
       return myposts; 
      default: 
       return null; 
     } 
    } 

    @Override 
    public int getCount() { 
     // Show 2 total pages. 
     return 2; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     switch (position) { 
      case 0: 
       return "All Posts"; 
      case 1: 
       return "My Posts"; 

     } 
     return null; 
     } 
    } 
} 

Hier ist der Code, wo das Bild sollte

in Imageview angezeigt werden

PostActivity.java

public class PostActivity extends Activity { 

    private ImageButton mImageSelect; 
    private EditText postTitle; 
    private EditText postDescription; 
    private Button submitButton; 
    private TextView changeImage; 
    private Uri imageUri=null; 
    private StorageReference storage; 
    private ProgressDialog progressDialogue; 
    private DatabaseReference database; 
    public String titleVal; 
    public String descriptionVal; 
    private ImageView mImageView; 
    private static final int GALLERY_REQUEST=1; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_post); 

     storage= FirebaseStorage.getInstance().getReference(); 
     database= FirebaseDatabase.getInstance().getReference().child("Posts"); 

     mImageView=(ImageView) findViewById(R.id.imageView); 

     postTitle=(EditText) findViewById(R.id.titleField); 
     postDescription=(EditText)findViewById(R.id.descriptionField); 
     submitButton=(Button) findViewById(R.id.submitPost); 

     progressDialogue=new ProgressDialog(this); 

     Intent intent=getIntent(); 
     Bitmap bitmap = (Bitmap) intent.getParcelableExtra("EXTRA_VALUE"); 
     imageUri=getIntent().getData(); 
     mImageView.setImageBitmap(bitmap); 

     submitButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startPosting(); 
      } 
     }); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString("titleVal", titleVal); 
     outState.putString("descriptionVal",descriptionVal); 
    } 

    private void startPosting() { 
     titleVal=postTitle.getText().toString().trim(); 
     descriptionVal=postDescription.getText().toString().trim(); 

     if(!TextUtils.isEmpty(titleVal) && !TextUtils.isEmpty(descriptionVal) && imageUri!=null){ 
      progressDialogue.setMessage("আপলোড হচ্ছে......"); 
      progressDialogue.show(); 

      StorageReference filePath=storage.child("post_images").child(imageUri.getLastPathSegment()); 
      filePath.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
        Uri downloadUrl=taskSnapshot.getDownloadUrl(); 
        Picasso.with(PostActivity.this).load(downloadUrl).into(mImageView); 
        DatabaseReference newPost=database.push(); 
        newPost.child("title").setValue(titleVal); 
        newPost.child("description").setValue(descriptionVal); 
        newPost.child("image").setValue(downloadUrl.toString()); 

        progressDialogue.dismiss(); 
        Toast.makeText(getApplicationContext(), "Successfully Uploaded", Toast.LENGTH_LONG).show(); 

        startActivity(new Intent(PostActivity.this,HomeActivity.class)); 
       } 
      }); 

     }else{ 
      Toast.makeText(getApplicationContext(), "Please provide a Title", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

überprüfen Sie bitte, dass 'data' is not null ist. 'if (data! = null)' {// Code hier eingeben} –

+0

@AnkitaShah Ich schätze, du sprichst über diese Codezeile: if (! TextUtils.isEmpty (titleVal) &&! TextUtils.isEmpty (descriptionVal) && imageUri! = null) // Aber ich finde nichts falsch daran. Warum denkst du, dass es ein Problem geben könnte? –

+0

@Shoumma Rauth: Ich spreche von onActivityResult(). Sie verwenden Datenparameter. Bevor Sie es verwenden, überprüfen Sie, ob es null ist oder nicht. –

Antwort

0

Wenn Sie die Kamera zum Aufnehmen von Bildern verwenden, sind Ihre Daten immer null.

Versuchen Aktivität in folgender Weise starten:

Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); 
String path; 
if (Environment.getExternalStorageState().equals(
     Environment.MEDIA_MOUNTED)) { 
    path = Environment.getExternalStorageDirectory() + "/appdir"; 
} else { 
    path = activity.getCacheDir() + "/appdir"; 
} 
String filePath = path + "/image.jpg"; 
Uri imageUri = Uri.fromFile(new File(filePath)); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, StaticStorage.selectedImageFromCamera); 
activity.startActivityForResult(intent, requestCode); 

Und auf onActivityResult() Sie Sie aufgenommene Bild Uri von StaticStorage.selectedImageUri

0

Bitte versuchen Sie den folgenden Code Sie kann hilfreich sein, abrufen können.

Zuerst deklarieren eine Variable

private static final int PICK_CAMERA_IMAGE = 2; 
private Uri imageCaptureUri; 

und danach fügen Sie den folgenden Code auf die Schaltfläche klicken oder onCreate()

Intent intent = new ntent(MediaStore.ACTION_IMAGE_CAPTURE); 
       File file = new File(Environment.getExternalStorageDirectory() 
         + "/imgDirectory", "imgName"+ ".png"); 

       imageCaptureUri= Uri.fromFile(file); 

       intent.putExtra(MediaStore.EXTRA_OUTPUT, imageCaptureUri); 
       startActivityForResult(intent, PICK_CAMERA_IMAGE); 

und in onActivityResult Bild erhalten von imageCaptureUri und Bild in Imageview.

Wenn Sie URI von einer Aktivität an eine andere senden möchten, können Sie diese URI mit intent senden. In onActivityResult diesen Code unten verwenden

Intent intent = new Intent(this, NewActivity.class); 
intent.putExtra("imageUri", imageCaptureUri.toString()); 
startActivity(intent); 

statt

img.setImageURI(imageCaptureUri);. 

und dann konvertieren nur zurück zu String wie diese in einer anderen Aktivität und setzen neuen geschaffen uri zu Imageview.

Uri newUri = Uri.parse(getIntent().getStringExtra("imageUri")); 
ImageView img = (ImageView) findViewById(R.id.imageView); 
img.setImageURI(newUri); 
+0

Das kann ich tun, aber ich möchte das Bild in eine neue Aktivität anzeigen und senden. Was ist zu tun? –

+0

@ShoummoRauth Bitte überprüfen Sie meine bearbeitete Antwort. – Shailesh

+0

Vielen Dank. Aber ich habe mich nur gefragt, ob ich "intent data" als onActivityResult als Parameter brauche, denn es scheint, dass die Daten null sind und wahrscheinlich als Ergebnis der App abstürzt. –

Verwandte Themen