2016-04-14 19 views
-1

Görüntüyü telefonun galerisinden alıp bir resim görünümünde ayarlıyorum ve bu görseldeki yüzleri algılamaya çalışan Google'ın mobil vizyon kütüphanesini kullanarak alıyorum. Görüntü boyutunu da küçülttüm, böylece ilk büyük boyutlu görüntü, görüntü görüntüsünde düzgün bir şekilde yüklenecek ancak başka bir büyük boyutlu resim yüklemeye çalışırsanız, uygulama çökecektir. Ayrıca büyük boyutlu görüntünün yüzlerini tespit ederken, uygulama bu resimlerde çöküyor app çöküyor.Büyük boyutlu resimlerdeki yüzleri algıladığında uygulama kilitleniyor

Logcat: logcat

MainActivity.java bildirim dosyası uygulama etiketinde kod aşağıdaki

package com.imagegallery.app.imagegallery; 

import android.content.Context; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.graphics.RectF; 
import android.graphics.drawable.BitmapDrawable; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 
import android.util.SparseArray; 
import android.view.Display; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

import com.google.android.gms.vision.Frame; 
import com.google.android.gms.vision.face.Face; 
import com.google.android.gms.vision.face.FaceDetector; 

import java.io.IOException; 
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import java.util.List; 
import java.util.TimeZone; 

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

private int PICK_IMAGE_REQUEST=1; 
Button btnLoad, btnDetFace; 
int count=0; 
Context cntx; 
String open_time,close_time; 
DatabaseHandler db = new DatabaseHandler(this); 
Bitmap bitmap; 
ImageView imageView; 
String img_name, realPath; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    cntx=this; 
    btnLoad=(Button) findViewById(R.id.btn_open); 
    btnLoad.setOnClickListener(this); 
    btnDetFace=(Button) findViewById(R.id.detection); 
    btnDetFace.setOnClickListener(this); 
} 

@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_main, menu); 
    // Return true to display 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(); 

    if (id == R.id.action_settings) { 
     Intent dbmanager = new Intent(this,AndroidDatabaseManager.class); 
     startActivity(dbmanager); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.btn_open: 
      Intent intent = new Intent(); 
      intent.setType("image/* video/*"); 
      intent.setAction(Intent.ACTION_GET_CONTENT); 
      startActivityForResult(intent, PICK_IMAGE_REQUEST); 
      break; 
     case R.id.detection: 
      if(bitmap == null){ 
       Toast.makeText(MainActivity.this, "bitmap == null", 
         Toast.LENGTH_LONG).show(); 
      } 
      else{ 
       detectFace(); 
       Toast.makeText(MainActivity.this,"Done", 
         Toast.LENGTH_LONG).show(); 
      } 
      break; 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) { 

     Uri uri = data.getData(); 
     try { 
      bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri); 
      imageView = (ImageView) findViewById(R.id.imageView); 
      //compressImage(uri); 
      // imageView.setImageBitmap(bitmap); 


      Display display = getWindowManager().getDefaultDisplay(); 
      Point size = new Point(); 
      display.getSize(size); 
      int width = size.x; 
      int height = size.y; 


      // SDK < API11 
      if (Build.VERSION.SDK_INT < 11) 
       realPath = RealPathUtil.getRealPathFromURI_BelowAPI11(this, data.getData()); 

       // SDK >= 11 && SDK < 19 
      else if (Build.VERSION.SDK_INT < 19) 
       realPath = RealPathUtil.getRealPathFromURI_API11to18(this, data.getData()); 

       // SDK > 19 (Android 4.4) 
      else 
       realPath = RealPathUtil.getRealPathFromURI_API19(this, data.getData()); 

      imageView.setImageBitmap(ImageResizer 
        .decodeSampledBitmapFromFile(realPath, width, height)); 

      img_name=realPath.substring(realPath.lastIndexOf("/")+1); 
      count = ++count; 

      if (count == 1) { 
       Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+5:30")); 
       Date currentLocalTime = cal.getTime(); 
       DateFormat date = new SimpleDateFormat("hh:mm:ss"); 
       date.setTimeZone(TimeZone.getTimeZone("GMT+5:30")); 
       String localTime = date.format(currentLocalTime); 
       open_time = localTime; 
      } 
      else if (count > 1) { 
       Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT+5:30")); 
       Date currentLocalTime = cal.getTime(); 
       DateFormat date = new SimpleDateFormat("hh:mm:ss"); 
       date.setTimeZone(TimeZone.getTimeZone("GMT+5:30")); 
       String localTime = date.format(currentLocalTime); 
       close_time = localTime; 
       Log.d("Insert: ", "Inserting .."); 
       db.addTime(new Time(img_name,open_time, close_time)); 
       open_time = localTime; 
       Log.d("Reading: ", "Reading all contacts.."); 
       List<Time> time = db.getAllData(); 

       for (Time t : time) { 
        String log = "Start time: " + t.getStartTime() + " ,End Time: " + t.getEndTime(); 
        // Writing Time to log 
        Log.d("Time: ", log); 
       } 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private void detectFace(){ 

    //Create a Paint object for drawing with 
    Paint myRectPaint = new Paint(); 
    myRectPaint.setStrokeWidth(5); 
    myRectPaint.setColor(Color.RED); 
    myRectPaint.setStyle(Paint.Style.STROKE); 

    //Create a Canvas object for drawing on 
    Bitmap tempBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565); 
    Canvas tempCanvas = new Canvas(tempBitmap); 
    tempCanvas.drawBitmap(bitmap, 0, 0, null); 

    //Detect the Faces 
    FaceDetector faceDetector = new FaceDetector.Builder(getApplicationContext()).build(); 

    //!!! 
    //Cannot resolve method setTrackingEnabled(boolean) 
    //skip for now 
    //faceDetector.setTrackingEnabled(false); 

    Frame frame = new Frame.Builder().setBitmap(bitmap).build(); 

    SparseArray<Face> faces = faceDetector.detect(frame); 

    //Draw Rectangles on the Faces 
    for(int i=0; i<faces.size(); i++) { 
     Face thisFace = faces.valueAt(i); 
     float x1 = thisFace.getPosition().x; 
     float y1 = thisFace.getPosition().y; 
     float x2 = x1 + thisFace.getWidth(); 
     float y2 = y1 + thisFace.getHeight(); 
     tempCanvas.drawRoundRect(new RectF(x1, y1, x2, y2), 2, 2, myRectPaint); 
    } 
    imageView.setImageDrawable(new BitmapDrawable(getResources(),tempBitmap)); 
} 
    } 
+0

Kilitlenme günlüğü nedir? –

+0

OOM İstisna belki? – Nanoc

+0

Bağlı logcat'i görebiliyorum – Neha

cevap

1

seti

android: Daha iyi

+0

Lütfen yukarıdaki yorumları okuyun ve cevaplayın. Android eklerken –

+0

android: largeHeap = "true", android manifest dosyasında resim yüklenir ama yüzleri algılamaya çalıştığımda görüntüden kaldırılır. – Neha

0

sıkıştırmak largeHeap = "true" bitmap kullanarak görüntü boyutu Sıkıştırma işlevi

tempBitmap.compress (Bitmap.CompressFormat.JPEG, 70, DosyaAdı);

İstediğiniz kadar sıkıştırma değerini ayarlayabilirsiniz.

0

http://developer.android.com/training/displaying-bitmaps/index.html

Bu durum için Android tarafından temin edilir Recycleimageview kullanmak zorunda. Görüntüleme zamanında bitmap'i sıkıştırabilirsiniz. Lütfen sorunuzun çözüleceği bağlantıyı inceleyiniz.

Ve android: largeHeap = "true" desteği, Android 3.0 sürümünden en son sürüme 2.3 sürümü desteklemiyor ve bu çözüm değil. Doğru bir şekilde sorunu düzeltmek istiyorsanız, geri dönüşüm sistemini kullanın.

İlgili konular