2016-04-07 13 views
1

Ich habe es geschafft, die Verwendung der ACTION_IMAGE_CAPTURE zu implementieren, um ein Foto in meiner App zu machen. Aus irgendeinem Grund ist das Vorschaubild (das Bild, das mit dem Häkchen/Kreuz-Symbol angezeigt wird, bevor es an meine App zurückgeschickt wird) quadratisch und hat eine wirklich niedrige Auflösung, auch wenn das Bild es mir gelungen ist Speichern im Speicher ist nicht. Ich habe alle Fragen durchgelesen, die über die Rückgabe eines qualitativ minderwertigen Bildes klagen, und alle Antworten liefern Lösungen, wie Sie das Bild mit höherer Qualität in Ihrer App selbst erhalten und nicht, wie Sie der Kamera-App eine Vorschau in voller Qualität geben können. Jede Hilfe wird sehr geschätzt!Bei Verwendung von ACTION_IMAGE_CAPTURE Warum ist das Vorschaubild verschwommen

Antwort

0

nicht, wie die Kamera-App anweisen, eine vollständige Qualitäts Vorschau zu verwenden

Das ist, weil es keine Möglichkeit für Sie ist es, die Kamera-App zu sagen, „eine vollständige Qualitäts Vorschau zu verwenden“.

Es gibt Tausende und Abertausende von Android-Gerätemodellen. Es gibt Hunderte von integrierten Kamera-Apps für diese Gerätemodelle und viele weitere, die zum Herunterladen von Orten wie dem Play Store verfügbar sind. Das Verhalten von ACTION_IMAGE_CAPTURE ist bis zu diesen Anwendungen Entwickler, darunter:

  • , ob sie eine Bestätigungsbildschirm (‚mit dem Häkchen/Kreuz-Symbol angezeigt wird, bevor es zu meiner App gesendet zurück‘)

  • , wie das Bild auf diesem Bestätigungsbildschirm sieht

anders als EXTRA_OUTPUT, gibt es keine anderen documented aspect to the ACTION_IMAGE_CAPTURE protocol in Bezug auf der Eingabe, und so Kamera-Anwendungen brauchen nichts anderes zu bieten.

Aus welchem ​​Grund auch immer, Ihre spezielle Kamera-App ist nicht besonders gut implementiert.

+0

Dies ist die Standardeinstellung kam Ra-App auf einem Android-Emulator mit der Webcam. –

+0

@BenWainwright: Das ändert die Antwort nicht. – CommonsWare

0

versuchen, unten Code Arbeit für meine App perfekt zu überprüfen.

TakeImageActivity.java

import java.io.File; 
import java.text.SimpleDateFormat; 
import java.util.ArrayList; 
import java.util.Date; 
import java.util.Locale; 

import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.database.Cursor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class TakeImageActivity extends ActivityBase implements OnClickListener { 

    File file,mFileTemp; 

    Button buttonTakeImageCam; 
    ImageView imageView; 
    Uri mPhotoUri; 
    Bitmap thumbnail; 
    private Uri fileUri; 
    private static final String IMAGE_DIRECTORY_NAME = "PhotoEditor Camera"; 
    public static final int MEDIA_TYPE_IMAGE = 1; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.take_image_activity); 

     file = new File(Environment.getExternalStorageDirectory() 
       .getAbsolutePath() + "/FrameImages"); 

     initializetion(); 

    } 

    private void initializetion() { 
     // TODO Auto-generated method stub 
     buttonTakeImageCam = (Button) findViewById(R.id.buttonTakeImageCam); 
     buttonTakeImageCam.setOnClickListener(this); 

     if (!isDeviceSupportCamera()) { 
      Toast.makeText(getApplicationContext(), 
        "Sorry! Your device doesn't support camera", 
        Toast.LENGTH_LONG).show(); 
      // will close the app if the device does't have camera 
      finish(); 
     } 
    } 

    private boolean isDeviceSupportCamera() { 
     if (getApplicationContext().getPackageManager().hasSystemFeature(
       PackageManager.FEATURE_CAMERA)) { 
      // this device has a camera 
      return true; 
     } else { 
      // no camera on this device 
      return false; 
     } 
    } 

    public Uri getOutputMediaFileUri(int type) { 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

    private static File getOutputMediaFile(int type) { 

     // External sdcard location 
     File mediaStorageDir = new File(
       Environment 
         .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
       IMAGE_DIRECTORY_NAME); 

     // Create the storage directory if it does not exist 
     if (!mediaStorageDir.exists()) { 
      if (!mediaStorageDir.mkdirs()) { 
       Log.d(IMAGE_DIRECTORY_NAME, "Oops! Failed create " 
         + IMAGE_DIRECTORY_NAME + " directory"); 
       return null; 
      } 
     } 
     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
       Locale.getDefault()).format(new Date()); 
     File mediaFile; 
     if (type == MEDIA_TYPE_IMAGE) { 
      mediaFile = new File(mediaStorageDir.getPath() + File.separator 
        + "IMG_" + timeStamp + ".jpg"); 
     } else { 
      return null; 
     } 

     return mediaFile; 
    } 


    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 

     switch (v.getId()) { 

     case R.id.buttonTakeImageCam: 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

      fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

      intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

      // start the image capture Intent 
      startActivityForResult(intent, 2); 
      break; 
     default: 
      break; 
     } 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     if (resultCode != RESULT_OK) 
      return; 

     switch (requestCode) { 

     case 2: 
       if (resultCode == RESULT_OK) { 
        // successfully captured the image 
        // display it in image view 
        previewCapturedImage(); 
       } else if (resultCode == RESULT_CANCELED) { 
        // user cancelled Image capture 
        Toast.makeText(getApplicationContext(), 
          "User cancelled image capture", Toast.LENGTH_SHORT) 
          .show(); 
       } else { 
        // failed to capture image 
        Toast.makeText(getApplicationContext(), 
          "Sorry! Failed to capture image", Toast.LENGTH_SHORT) 
          .show(); 
       } 
      break; 
     } 
    } 
     private void previewCapturedImage() { 
      try { 
       // bimatp factory 
       BitmapFactory.Options options = new BitmapFactory.Options(); 

       // downsizing image as it throws OutOfMemory Exception for larger 
       // images 
       options.inSampleSize = 2; 

       final Bitmap bitmap = BitmapFactory.decodeFile(fileUri.getPath(), 
         options); 

        //Set image here 
       imgPreview.setImageBitmap(bitmap); 

      } catch (NullPointerException e) { 
       e.printStackTrace(); 
      } 
     } 

    public Bitmap getPreview(String fileName) { 
     File image = new File(fileName); 

     BitmapFactory.Options bounds = new BitmapFactory.Options(); 
     bounds.inJustDecodeBounds = true; 
     BitmapFactory.decodeFile(image.getPath(), bounds); 
     if ((bounds.outWidth == -1) || (bounds.outHeight == -1)) { 
      return null; 
     } 
     int originalSize = (bounds.outHeight > bounds.outWidth) ? bounds.outHeight 
       : bounds.outWidth; 
     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inSampleSize = originalSize/64; 
     // opts.inSampleSize = originalSize; 
     return BitmapFactory.decodeFile(image.getPath()); 
    } 

    public String getPath(Uri uri) { 
     String[] projection = { MediaStore.Images.Media.DATA }; 
     Cursor cursor = managedQuery(uri, projection, null, null, null); 
     int column_index = cursor 
       .getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 
     cursor.moveToFirst(); 
     return cursor.getString(column_index); 
    } 
} 

take_image_activity.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_gravity="center" > 

    <Button 
     android:id="@+id/buttonTakeImageCam" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="10dp" 
     android:textSize="25sp" 
     android:text="Camera"/> 

</RelativeLayout> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.camera.photo" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="9" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.CAMERA"/> 
    <uses-feature android:name="android.hardware.camera" android:required="true"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:largeHeap="true" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".TakeImageActivity" 
      android:hardwareAccelerated="false" 
      android:screenOrientation="portrait" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
Verwandte Themen