Saya memiliki aplikasi android yang berisi beberapa kegiatan.
Di salah satu dari mereka saya menggunakan tombol yang akan memanggil kamera perangkat:
public void onClick(View view) {
Intent photoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(photoIntent, IMAGE_CAPTURE);
}
Dalam aktivitas yang sama saya memanggil OnActivityResult
metode untuk hasil gambar:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK) {
Bitmap image = (Bitmap) data.getExtras().get("data");
ImageView imageview = (ImageView) findViewById(R.id.pic);
imageview.setImageBitmap(image);
} else if (resultCode == RESULT_CANCELED) {
Toast.makeText(this, "CANCELED ", Toast.LENGTH_LONG).show();
}
}
}
Masalahnya adalah bahwa maksudnya data
adalah nol dan OnActivityResult
metode beralih langsung ke (resultCode == RESULT_CANCELED)
dan aplikasi kembali ke aktivitas sebelumnya.
Bagaimana saya bisa memperbaiki masalah ini dan setelah memanggil kamera, aplikasi kembali ke aktivitas saat ini yang berisi ImageView
yang akan berisi gambar yang diambil?
Terima kasih
android
android-camera
android-imageview
soft_developer
sumber
sumber
Jawaban:
Aplikasi kamera Android default mengembalikan niat tidak nol hanya ketika mengirimkan kembali thumbnail di Intent yang dikembalikan. Jika Anda lulus
EXTRA_OUTPUT
dengan URI untuk menulis, itu akan menghasilkannull
niat dan gambar di URI yang Anda lewati.Anda dapat memverifikasi ini dengan melihat kode sumber aplikasi kamera di GitHub:
https://github.com/android/platform_packages_apps_camera/blob/gingerbread-release/src/com/android/camera/Camera.java#L1186
Saya kira Anda entah
EXTRA_OUTPUT
bagaimana sedang lewat , atau aplikasi kamera di ponsel Anda bekerja berbeda.sumber
Saya menemukan jawaban yang mudah. berhasil!!
jika Anda ingin memotong dan skala gambar ini
sumber
FileUriExposedException
pada versi SDK modern.Saya pernah mengalami masalah ini,
intent
ini bukan nol tetapi informasi yang dikirim melalui iniintent
tidak diterima masukonActionActivit()
Ini adalah solusi yang lebih baik menggunakan getContentResolver () :
yang
onActivityResult()
mendapatkan bitmap disimpan oleh getContentResolver () :Lihat contoh saya di github:
https://github.com/Jorgesys/TakePicture
sumber
Aplikasi kamera yang berfungsi sederhana menghindari masalah niat nol
- semua kode yang diubah termasuk dalam balasan ini; dekat dengan tutorial android
Saya telah menghabiskan banyak waktu untuk masalah ini, jadi saya memutuskan untuk membuat akun dan membagikan hasil saya dengan Anda.
Tutorial android resmi "Mengambil Foto Secara Sederhana" ternyata tidak cukup sesuai dengan yang dijanjikan. Kode yang disediakan di sana tidak berfungsi pada perangkat saya: Samsung Galaxy S4 Mini GT-I9195 yang menjalankan Android versi 4.4.2 / KitKat / API Level 19.
Saya menemukan bahwa masalah utama adalah baris berikut dalam metode yang dipanggil saat mengambil foto (
dispatchTakePictureIntent
dalam tutorial):Akibatnya niat kemudian ditangkap dengan
onActivityResult
menjadi nol.Untuk mengatasi masalah ini, saya menarik banyak inspirasi dari balasan sebelumnya di sini dan beberapa posting bermanfaat di github (sebagian besar yang ini oleh deepwinter - terima kasih besar kepadanya; Anda mungkin ingin memeriksa jawabannya di posting yang berkaitan erat juga).
Mengikuti saran yang menyenangkan ini, saya memilih strategi menghapus
putExtra
garis yang disebutkan dan melakukan hal yang sesuai untuk mendapatkan kembali gambar yang diambil dari kamera dalam metode onActivityResult () sebagai gantinya. Baris-baris kode yang menentukan untuk mendapatkan kembali bitmap yang terkait dengan gambar adalah:Saya membuat aplikasi contoh yang hanya memiliki kemampuan untuk mengambil gambar, menyimpannya di kartu SD dan menampilkannya. Saya pikir ini mungkin bermanfaat bagi orang-orang dalam situasi yang sama dengan saya ketika saya menemukan masalah ini, karena saran bantuan saat ini kebanyakan merujuk pada posting github yang agak luas yang melakukan hal tersebut tetapi tidak terlalu mudah untuk diawasi bagi pemula seperti saya. Sehubungan dengan sistem file yang dibuat Android Studio per default saat membuat proyek baru, saya hanya perlu mengubah tiga file untuk tujuan saya:
activity_main.xml:
MainActivity.java:
AndroidManifest.xml:
Perhatikan bahwa solusi yang saya temukan untuk masalah ini juga menyebabkan penyederhanaan file manifes android: perubahan yang disarankan oleh tutorial android dalam hal menambahkan penyedia tidak lagi diperlukan karena saya tidak menggunakan apapun dalam kode java saya. Oleh karena itu, hanya beberapa baris standar - terutama tentang izin - yang harus ditambahkan ke file manifes.
Mungkin juga bermanfaat untuk menunjukkan bahwa autoimport Android Studio mungkin tidak mampu menangani
java.text.SimpleDateFormat
danjava.util.Date
. Saya harus mengimpor keduanya secara manual.sumber
Mungkin karena Anda punya sesuatu seperti ini?
Namun Anda tidak boleh memasukkan output ekstra ke maksud, karena dengan demikian data masuk ke URI alih-alih variabel data. Untuk alasan itu, Anda harus mengambil dua garis di tengah, jadi Anda harus
Itulah yang menyebabkan masalah bagi saya, harapan yang membantu.
sumber
Kode berikut ini berfungsi untuk saya:
Dan inilah hasilnya:
sumber
imageReturnedIntent.getData()
nilai nol. Saya membuat maksud yang sama dengan Anda. Tidak menempatkan params tambahan.Untuk Mengakses Kamera dan mengambil gambar dan mengatur ImageView di Android
Anda harus menggunakan
Uri file = Uri.fromFile(getOutputMediaFile());
marshmallow.Gunakan tautan di bawah ini untuk mendapatkan jalur
https://androidkennel.org/android-camera-access-tutorial/
sumber
Kode Kotlin yang berfungsi untuk saya:
Dan dapatkan Hasil:
dan jangan lupa untuk mendeklarasikan kode permintaan:
sumber
Setelah banyak mencoba dan belajar, saya bisa mengetahuinya. Pertama, data variabel dari Intent akan selalu nol jadi, oleh karena itu, memeriksa
!null
akan crash aplikasi Anda selama Anda melewati URI untuk memulaiActivityForResult. Ikuti contoh di bawah ini. Saya akan menggunakan Kotlin.Buka maksud kamera
} `
Buat createImageFile (). Tetapi Anda HARUS membuat variabel imageFilePath global. Contoh tentang cara membuatnya ada di dokumentasi resmi Android dan cukup mudah
Dapatkan Intent
Metode getBytesFromBitmap
Saya harap ini membantu.
sumber
Ketika kita akan mengambil gambar dari Camera di android maka Uri atau
data.getdata()
null. kami memiliki dua solusi untuk mengatasi masalah ini.Saya akan menerapkan semua metode di sini, Harap hati-hati menonton dan membaca ini: -
Pertama saya akan memberi tahu cara mendapatkan Uri dari Bitmap Image: Kode lengkapnya adalah:
Pertama kita akan menangkap gambar melalui Intent yang akan sama untuk kedua metode sehingga kode ini saya akan menulis satu kali hanya di sini:
Sekarang kita akan Menerapkan OnActivityResult :-( Ini akan sama untuk kedua metode di atas): -
Sekarang kita akan membuat semua metode di atas untuk membuat Uri dari metode Gambar dan Kursor melalui kelas:
Sekarang jalur URI dari Bitmap Image
\ Uri dari jalur nyata dari gambar yang disimpan
sumber
Ketika kita menangkap gambar dari kamera di Android kemudian
Uri
ataudata.getdata()
menjadi nol. Kami memiliki dua solusi untuk mengatasi masalah ini.Ini adalah cara mengambil Uri dari Gambar Bitmap. Pertama ambil gambar melalui Intent yang akan sama untuk kedua metode:
Sekarang implementasikan
OnActivityResult
, yang akan sama untuk kedua metode:Sekarang buat semua metode di atas untuk membuat Uri dari metode Gambar dan Kursor:
Jalur Uri dari Gambar Bitmap:
Uri dari jalur asli gambar yang disimpan:
sumber