ini adalah bug yang terdokumentasi dengan baik di beberapa versi android. yaitu, berdasarkan pengalaman Google membangun android, pengambilan gambar tidak berfungsi seperti yang didokumentasikan. apa yang saya umumnya gunakan adalah sesuatu seperti ini di kelas utilitas.
public boolean hasImageCaptureBug() {
// list of known devices that have the bug
ArrayList<String> devices = new ArrayList<String>();
devices.add("android-devphone1/dream_devphone/dream");
devices.add("generic/sdk/generic");
devices.add("vodafone/vfpioneer/sapphire");
devices.add("tmobile/kila/dream");
devices.add("verizon/voles/sholes");
devices.add("google_ion/google_ion/sapphire");
return devices.contains(android.os.Build.BRAND + "/" + android.os.Build.PRODUCT + "/"
+ android.os.Build.DEVICE);
}
lalu ketika saya meluncurkan pengambilan gambar, saya membuat maksud yang memeriksa bug.
Intent i = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
if (hasImageCaptureBug()) {
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File("/sdcard/tmp")));
} else {
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
}
startActivityForResult(i, mRequestCode);
lalu dalam aktivitas yang saya kembali ke, saya melakukan hal-hal yang berbeda berdasarkan perangkat.
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
switch (requestCode) {
case GlobalConstants.IMAGE_CAPTURE:
Uri u;
if (hasImageCaptureBug()) {
File fi = new File("/sdcard/tmp");
try {
u = Uri.parse(android.provider.MediaStore.Images.Media.insertImage(getContentResolver(), fi.getAbsolutePath(), null, null));
if (!fi.delete()) {
Log.i("logMarker", "Failed to delete " + fi);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
} else {
u = intent.getData();
}
}
ini menghemat Anda harus menulis aplikasi kamera baru, tetapi kode ini juga tidak bagus. masalah besar adalah
Anda tidak pernah mendapatkan gambar berukuran penuh dari perangkat dengan bug. Anda mendapatkan gambar dengan lebar 512px yang dimasukkan ke penyedia konten gambar. pada perangkat tanpa bug, semuanya berfungsi sebagai dokumen, Anda mendapatkan gambar normal yang besar.
Anda harus menjaga daftarnya. seperti yang tertulis, adalah mungkin bagi perangkat untuk di-flash dengan versi android (katakanlah cyanogenmod's build ) yang memiliki bug diperbaiki. jika itu terjadi, kode Anda akan macet. Cara mengatasinya adalah dengan menggunakan seluruh sidik jari perangkat.
Saya tahu ini telah dijawab sebelumnya tetapi saya tahu banyak orang tersandung pada ini, jadi saya akan menambahkan komentar.
Saya memiliki masalah yang sama persis ini terjadi pada Nexus One saya. Ini dari file yang tidak ada pada disk sebelum aplikasi kamera dimulai. Karena itu, saya memastikan bahwa file yang ada sebelum memulai aplikasi kamera. Berikut beberapa contoh kode yang saya gunakan:
Saya pertama kali membuat nama file yang unik (agak) menggunakan hash MD5 dan memasukkannya ke folder yang sesuai. Saya kemudian memeriksa untuk melihat apakah ada (tidak boleh, tetapi praktik yang baik untuk memeriksa pula). Jika tidak ada, saya mendapatkan dir induk (folder) dan membuat hierarki folder hingga itu (karena itu jika folder yang mengarah ke lokasi file tidak ada, mereka akan setelah baris ini. Kemudian setelah itu Saya membuat file. Setelah file dibuat saya mendapatkan Uri dan meneruskannya ke maksud dan kemudian tombol OK berfungsi seperti yang diharapkan dan semuanya berwarna emas.
Sekarang, ketika tombol Ok ditekan pada aplikasi kamera, file akan ada di lokasi yang diberikan. Dalam contoh ini akan menjadi /sdcard/Android/data/com.example.myapp/files/234asdioue23498ad.jpg
Tidak perlu menyalin file di "onActivityResult" seperti yang diposting di atas.
sumber
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
manifes jika Anda menggunakan yang lebih baru dari Android 1.5 - menghabiskan beberapa jam men-debug hal-hal kamera dan ini tidak termasuk sehingga menghemat saya akan selalu gagal.Saya telah melalui sejumlah strategi pengambilan foto, dan sepertinya selalu ada kasing, platform atau perangkat tertentu, di mana beberapa atau semua strategi di atas akan gagal dengan cara yang tidak terduga. Saya dapat menemukan strategi yang menggunakan kode generasi URI di bawah ini yang tampaknya berfungsi di sebagian besar atau tidak semua kasus.
Untuk berkontribusi lebih jauh dalam diskusi dan membantu pendatang baru saya telah membuat aplikasi sampel / uji yang menunjukkan beberapa strategi yang berbeda untuk implementasi pengambilan foto. Kontribusi implementasi lain pasti didorong untuk menambah diskusi.
https://github.com/deepwinter/AndroidCameraTester
sumber
onActivityResult
atau saya benar-benar harus mengingatnya sendiri? Saya harus terus-menerus menyimpannya sehingga aplikasi saya bahkan mengingatnya jika dihancurkan saat foto diambil ...Saya memiliki masalah yang sama di mana tombol OK di aplikasi kamera tidak melakukan apa pun, baik pada emulator dan pada nexus satu.
Masalahnya hilang setelah menentukan nama file aman yang tanpa spasi, tanpa karakter khusus, di
MediaStore.EXTRA_OUTPUT
Juga, jika Anda menentukan file yang berada di direktori yang belum dibuat, Anda harus membuatnya terlebih dahulu. Aplikasi kamera tidak melakukan mkdir untuk Anda.sumber
mkdirs()
alih-alihmkdir()
jika jalur Anda memiliki lebih dari satu tingkat direktori dan Anda ingin semuanya dibuat (mkdir
hanya membuat yang terakhir, direktori 'daun'). Saya punya beberapa masalah dengan itu, dan jawaban ini membantu saya.Alur kerja yang Anda gambarkan harus berfungsi seperti yang Anda gambarkan. Mungkin membantu jika Anda dapat menunjukkan kepada kami kode seputar pembuatan Intent. Secara umum, pola berikut harus membiarkan Anda melakukan apa yang Anda coba.
Perhatikan bahwa Aktivitas Kamera yang akan membuat dan menyimpan file, dan itu sebenarnya bukan bagian dari aplikasi Anda, jadi itu tidak akan memiliki izin menulis ke folder aplikasi Anda. Untuk menyimpan file ke folder aplikasi Anda, buat file sementara di kartu SD dan pindahkan ke folder aplikasi Anda di
onActivityResult
handler.sumber
Untuk menindaklanjuti komentar Yenchi di atas, tombol OK juga tidak akan melakukan apa-apa jika aplikasi kamera tidak dapat menulis ke direktori yang dimaksud.
Itu berarti bahwa Anda tidak dapat membuat file di tempat yang hanya dapat ditulisi oleh aplikasi Anda (misalnya, sesuatu di bawah
getCacheDir())
Sesuatu di bawahgetExternalFilesDir()
seharusnya berfungsi.Akan lebih baik jika aplikasi kamera mencetak pesan kesalahan ke log jika tidak bisa menulis ke
EXTRA_OUTPUT
jalur yang ditentukan , tetapi saya tidak menemukannya.sumber
agar kamera menulis ke kartu sd tetapi menyimpan Album baru di aplikasi galeri saya menggunakan ini:
Harap dicatat bahwa Anda perlu membuat nama file unik setiap kali dan mengganti teh 1111.jpg yang saya tulis. Ini diuji dengan nexus satu. uri dideklarasikan di kelas privat, jadi pada hasil aktivitas saya dapat memuat gambar dari uri ke imageView untuk pratinjau jika diperlukan.
sumber
Saya memiliki masalah yang sama dan saya memperbaikinya dengan yang berikut:
Masalahnya adalah ketika Anda menentukan file yang hanya dapat diakses oleh aplikasi Anda (mis. Dengan menelepon
getFileStreamPath("file");
)Itu sebabnya saya hanya memastikan bahwa file yang diberikan benar-benar ada dan bahwa SEMUA ORANG memiliki akses tulis ke sana.
Dengan cara ini, aplikasi kamera memiliki akses tulis ke Uri yang diberikan dan tombol OK berfungsi dengan baik :)
sumber
Saya sarankan Anda untuk mengikuti pos pelatihan android untuk mengambil foto. Mereka menunjukkan dalam contoh bagaimana mengambil foto kecil dan besar. Anda juga dapat mengunduh kode sumber dari sini
sumber
Saya membuat pustaka sederhana yang akan mengelola pemilihan gambar dari sumber yang berbeda (Galeri, Kamera), mungkin menyimpannya ke beberapa lokasi (SD-Card atau memori internal) dan mengembalikan gambar itu jadi silakan bebas untuk menggunakannya dan memperbaikinya - Android-ImageChooser .
sumber
File perlu ditulis oleh kamera, seperti yang ditunjukkan Praveen .
Dalam penggunaan saya, saya ingin menyimpan file dalam penyimpanan internal. Saya melakukan ini dengan:
Berikut
cacheFile
adalah file global yang digunakan untuk merujuk ke file yang ditulis. Kemudian dalam metode hasil niat yang dikembalikan adalah nol. Maka metode untuk memproses maksud terlihat seperti:Berikut
getImageFile()
adalah metode utilitas untuk memberi nama dan membuat file di mana gambar harus disimpan, dancopyFile()
merupakan metode untuk menyalin file.sumber
Anda dapat menggunakan kode ini
sumber
Sangat mudah untuk menyelesaikan masalah ini dengan Activity Result Code. Cobalah metode ini
sumber
sumber