SORU
6 NİSAN 2012, Cuma


Nasıl kamera veri klasöründe bir urı olarak sonuç almak için?

Bir görüntü yakalamak istiyorum bir uygulama oluşturmak ve bir ek olarak e-posta bu görüntüyü göndermek istiyorum.

Kamera android.provider.MediaStore.ACTION_IMAGE_CAPTURE niyet eylemi kullanarak açıyorum ve 12 ** parametre olarak dosyanın Urı görüntü dosyasına geri almak için taşıyorum. Bu çalışma mükemmel ve ben mümkün almak için çekilen resim yapıyorum external storage uri EXTRA_OUTPUT ama eğer kullandığım data klasörü uri çalışmadığını ve model değil kapanış ve tüm düğmeleri çalışmıyor.

Burada harici depolama dizini içinde sonuç almak için kod

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File out = Environment.getExternalStorageDirectory();
out = new File(out, imagename);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out));
startActivityForResult(i, CAMERA_RESULT);

Ve bu kod veri görüntü klasörü almak için

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
File out = getFilesDir();
out = new File(out, MyPharmacyOptions.PRESCRIPTION_IMAGE_NAME);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(out));
startActivityForResult(i, CAMERA_RESULT);

Bunu biliyordumveri klasör üçüncü uygulama için uygun değildiryani bu neden olabilir dosya paylaşımı için bir içerik sağlayıcı oluşturmak var öyle bir sorun.

İşte benim içerik sınıf bulunur

public class MyContentProvider extends ContentProvider {
    private static final String Tag = RingtonContentProvider.class.getName();
    public static final Uri CONTENT_URI = Uri
            .parse("content://x.y.z/");
    private static final HashMap<String, String> MIME_TYPES = new HashMap<String, String>();

    static {
        MIME_TYPES.put(".mp3", "audio/mp3");
        MIME_TYPES.put(".wav", "audio/mp3");
        MIME_TYPES.put(".jpg", "image/jpeg");
    }

    @Override
    public boolean onCreate() {
        return true;
    }

    @Override
    public String getType(Uri uri) {
        String path = uri.toString();

        for (String extension : MIME_TYPES.keySet()) {
            if (path.endsWith(extension)) {
                return (MIME_TYPES.get(extension));
            }
        }

        return (null);
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode)
            throws FileNotFoundException {
        File f = new File(getContext().getFilesDir(), uri.getPath());

        if (f.exists()) {
            return (ParcelFileDescriptor.open(f, ParcelFileDescriptor.MODE_READ_ONLY));
        }

        throw new FileNotFoundException(uri.getPath());
    }

    @Override
    public Cursor query(Uri url, String[] projection, String selection,
            String[] selectionArgs, String sort) {
        throw new RuntimeException("Operation not supported");
    }

    @Override
    public Uri insert(Uri uri, ContentValues initialValues) {
        File file = new File(getContext().getFilesDir(), uri.getPath());
        if(file.exists()) file.delete();
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return Uri.fromFile(file);
    }

    @Override
    public int update(Uri uri, ContentValues values, String where,
            String[] whereArgs) {
        throw new RuntimeException("Operation not supported");
    }

    @Override
    public int delete(Uri uri, String where, String[] whereArgs) {
        File f = new File(getContext().getFilesDir(), "image1.jpg");
        if(f.exists()) f.delete();
        f = new File(getContext().getFilesDir(), "image2.jpg");
        if(f.exists()) f.delete();

        getContext().getContentResolver().notifyChange(CONTENT_URI, null);

    }
}

Bu içeriği kullanmak için aşağıdaki kodu kamera aktivite için urı geçirmek için kullanıyorum sağlamak

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = MyContentProvider.CONTENT_URI;
uri = Uri.withAppendedPath(uri, imagename);
getContentResolver().insert(uri, null);
getContentResolver().notifyChange(RingtonContentProvider.CONTENT_URI, null);
Log.d(Tag, uri.toString());
i.putExtra(MediaStore.EXTRA_OUTPUT, uri);

startActivityForResult(i, CAMERA_RESULT);

Şimdi ise url diğer harici depolama dizini geçersem kamerayı açıyor ama kapalı kamera gidiyor aygıt öykünücüsü ama kapanış değil ama sonuç alamıyorum.

Bu içerik sağlamak bildirim dosyası olarak ilan ediyorum

<provider
android:name=".contentproviders.MyContentProvider"
android:authorities="x.y.z" />

Ayrıca için izin verdimdış depolama yazınve aynı zamanda içinfotoğraf makinesini kullanın.

Ben mümkün yakalama görüntü kullanarak harici depolama vermek istiyorum mağaza görüntü verileri dizini yerine harici depolama çünkü eğer harici depolama olarak kullanılamaz istediğim için yakalama görüntü ve posta gönderin.

Eğer içerik sağlamak oluşturun sonra da e-posta uygulaması için benim resim paylaşabilirim.

Eğer biz sağlamak ekstralar ile kamera niyet dönecektir resmi olarak bir byte[] faaliyet sonucunda bir veri ekstra ama bu amacına uygun küçük o yüzden alamıyorum yüksek çözünürlüklü resim kullanarak bu şekilde.

Sorum şu haline bir bak ve önerilerinizi verin lütfen. Teşekkürler.

CEVAP
19 NİSAN 2012, PERŞEMBE


Bu sorunu çözmek için iki yol vardır. Eğer kamera etkinliği ACTION_IMAGE-CAPTUREkullanarak başlatırsanız onActivityResult gelen bitmap alabilirsiniz. İçerik sağlayıcı kullanarak kamera aktivite telefonun dahili hafıza(uygulama, dizin Dosyası) görüntü kaydedebilirsiniz.

1. İlk çözüm çok kolaydır. kamera aktivite bu kodu kullanmaya başlamak

Intent cameraIntent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);

fotoğraf çektikten sonra, ActivtyResult sonuç alırsınız.

if (requestCode == CAMERA_REQUEST) {  
    Bitmap photo = (Bitmap) data.getExtras().get("data"); 
 }

Not::Bu ilk çözüm iyi çalışıyor ama alıyorsanız bit eşlemonActivityResult()düşük çözünürlüklü. Eğer yüksek çözünürlüklü görüntü istiyorsan, o zaman ikinci bir çözüm tercih etmelisiniz.

2. İkinci çözüm biraz uzun ama çok önemli.

Bu durumda kamera faaliyeti (Uygulama iç) yerel dosya paylaşımı için kullanılacak olan içerik sağlayıcı oluşturmak zorunda kalacaksınız.

Aşağıda değiştim İçerik sağlayıcı sınıfım ve doğru olun.

public class MyFileContentProvider extends ContentProvider {
    public static final Uri CONTENT_URI = Uri.parse
                                    ("content://com.example.camerademo/");
    private static final HashMap<String, String> MIME_TYPES = 
                                     new HashMap<String, String>();

    static {
        MIME_TYPES.put(".jpg", "image/jpeg");
        MIME_TYPES.put(".jpeg", "image/jpeg");
    }

    @Override
    public boolean onCreate() {

        try {
            File mFile = new File(getContext().getFilesDir(), "newImage.jpg");
            if(!mFile.exists()) {
                mFile.createNewFile();
            }
            getContext().getContentResolver().notifyChange(CONTENT_URI, null);
            return (true);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }

    }

    @Override
    public String getType(Uri uri) {
        String path = uri.toString();

        for (String extension : MIME_TYPES.keySet()) {
            if (path.endsWith(extension)) {
                return (MIME_TYPES.get(extension));
            }
        }
        return (null);
    }

    @Override
    public ParcelFileDescriptor openFile(Uri uri, String mode)
    throws FileNotFoundException {

        File f = new File(getContext().getFilesDir(), "newImage.jpg");
        if (f.exists()) {
            return (ParcelFileDescriptor.open(f,
                    ParcelFileDescriptor.MODE_READ_WRITE));
        }
        throw new FileNotFoundException(uri.getPath());
    }
}

Ve kamera bu etkinlik için sadece bir başlangıç

Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, MyFileContentProvider.CONTENT_URI);
startActivityForResult(i, CAMERA_RESULT);

Daha fazla bilgi için this blog başvurabilirsiniz

Not :: emülatör. test Yok Bazen emülatör çalışmıyor.

Kolayca çözümü anlamak için bazı içerik ekliyorum o yüzden boş niyet hakkında birçok yorum ve düşük çözünürlüklü görüntüler alıyorum

EDİT

Kod kameradan yüksek çözünürlüklü görüntüler elde etmek için.

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 /** 
 Here destination is the File object in which your captured images will be stored
 **/
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destination));
/**
Here REQUEST_IMAGE is the unique integer value you can pass it any integer
**/
startActivityForResult(intent, REQUEST_IMAGE);

Bu aşağıdaki gibi onActivityResult metodu uygulandıktan sonra

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if(requestCode == REQUEST_IMAGE && resultCode == Activity.RESULT_OK) {
        // Now check the file which you have pass with the intent to capture.
        // Camera had stored the captured image to the file which you have passed with the intent.
    }
}

Not:Eğer niyet ile dosya URi geçirmeden sonra kamera dosya erişilebilir değilse bu dosyada çekilen bir görüntü yazacak olan kamera uygulaması ile zihin tutmak.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Maya Learning Channel

    Maya Learnin

    23 HAZİRAN 2010
  • Richard Laxa

    Richard Laxa

    30 AĞUSTOS 2012