Захват изображения и загрузка внутри фрагмента в kotlin - PullRequest
0 голосов
/ 19 января 2020

ЭТО МОЙ XML

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:context=".MakeComplaint.Category_Description"
        android:background="@drawable/fragmentgradient_bg">



    <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/heading_constraint"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            tools:layout_editor_absoluteX="17dp">


        <ImageView

                android:id="@+id/backToHistory"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:paddingHorizontal="20dp"
                android:layout_weight="2"
                android:src="@drawable/ic_backarrow"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintRight_toLeftOf="@+id/location_title"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

        <TextView
                android:id="@+id/location_title"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:paddingHorizontal="20dp"
                android:fontFamily="@font/pathway_gothic_one"
                android:gravity="center"
                android:textSize="40sp"
                android:text="Further Details"
                app:layout_constraintHorizontal_bias="0.35"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toRightOf="@+id/backToHistory"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>



    <androidx.cardview.widget.CardView
            android:id="@+id/details_card"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:elevation="@dimen/card_spacing"
            app:cardUseCompatPadding="true"
            app:layout_constraintTop_toBottomOf="@+id/heading_constraint"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintBottom_toBottomOf="parent"
            app:cardCornerRadius="@dimen/card_spacing"
            >

        <ScrollView
                android:id="@+id/scroll"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
               android:fillViewport="true">


            <androidx.constraintlayout.widget.ConstraintLayout
                    android:id="@+id/inner_constraint"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:padding="@dimen/card_spacing">


                <TextView
                        android:id="@+id/guide"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:fontFamily="@font/pathway_gothic_one"
                        android:gravity="left"
                        android:text="Please enter any further details you would like to add:"
                        android:textSize="20sp"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintTop_toTopOf="parent" />

                <com.google.android.material.textfield.TextInputLayout
                        android:id="@+id/description_text_input"
                        style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        android:layout_marginTop="20dp"
                        app:boxStrokeColor="@color/teal"
                        app:boxStrokeWidth="@dimen/card_spacing"
                        app:counterEnabled="true"
                        app:counterMaxLength="500"
                        android:hint="Additional Notes"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintTop_toBottomOf="@id/guide"
                        app:prefixTextColor="@color/colorPrimaryDark"
                        android:outlineAmbientShadowColor="@color/teal"
                        android:outlineSpotShadowColor="@color/teal"
                        android:scrollbarAlwaysDrawHorizontalTrack="true"
                        app:layout_constraintBaseline_creator="@android:integer/config_longAnimTime"

                        >

                    <com.google.android.material.textfield.TextInputEditText
                            android:id="@+id/description"
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:inputType="textCapSentences|textMultiLine"
                            android:maxLength="500"


                            />


                </com.google.android.material.textfield.TextInputLayout>

                <!--ImageView where image will be set-->
                <ImageView
                        android:id="@+id/display_image"
                        android:scaleType="centerCrop"
                        android:layout_width="250dp"
                        android:layout_height="250dp"
                        android:adjustViewBounds="true"
                        app:layout_constraintTop_toBottomOf="@+id/description_text_input"
                        app:layout_constraintBottom_toTopOf="@+id/FAB_buttons"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintLeft_toLeftOf="parent"/>

                <androidx.appcompat.widget.LinearLayoutCompat
                        android:id="@+id/FAB_buttons"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        app:layout_constraintTop_toBottomOf="@+id/description_text_input"
                        app:layout_constraintRight_toRightOf="parent"
                        android:layout_marginVertical="5dp">

                <com.google.android.material.floatingactionbutton.FloatingActionButton
                        android:id="@+id/camera"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="16dp"
                        app:backgroundTint="@color/teal"
                        android:layout_marginHorizontal="@dimen/card_spacing"
                        android:src="@android:drawable/ic_menu_camera"
                        app:layout_constraintRight_toLeftOf="@+id/camera"
                        app:layout_constraintTop_toBottomOf="@+id/name_text_input"


                        />

                <com.google.android.material.floatingactionbutton.FloatingActionButton
                        android:id="@+id/upload"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="16dp"
                        app:backgroundTint="@color/teal"
                        app:layout_constraintRight_toRightOf="parent"
                        app:layout_constraintTop_toBottomOf="@+id/name_text_input"
                        android:src="@android:drawable/ic_menu_gallery"
                        />
                </androidx.appcompat.widget.LinearLayoutCompat>

                <com.google.android.material.button.MaterialButton
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Make Complaint"
                        app:layout_constraintTop_toBottomOf="@+id/FAB_buttons"
                        app:layout_constraintBottom_toBottomOf="parent"
                        app:layout_constraintLeft_toLeftOf="parent"
                        app:layout_constraintRight_toRightOf="parent"
                        app:backgroundTint="@color/teal"
                        />


            </androidx.constraintlayout.widget.ConstraintLayout>
        </ScrollView>
    </androidx.cardview.widget.CardView>




</androidx.constraintlayout.widget.ConstraintLayout>```

**THIS IS MY KOTLIN FILE**

пакет com.example.atry.MakeComplaint

class Category_Description: Fragment () {

private val ALL_PERMISSIONS_RESULT = 107
private val IMAGE_RESULT = 200
private val REQUEST_IMAGE_CAPTURE = 12345



var mBitmap: Bitmap? = null
val permission = 1

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {

    }
}

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    // Inflate the layout for this fragment
    val v = inflater.inflate(com.example.atry.R.layout.fragment_category__description, container, false)

    val camera_FAB: View = v.findViewById(com.example.atry.R.id.camera)
    val upload_FAB: View = v.findViewById(com.example.atry.R.id.upload)
    val imageView = v.findViewById<ImageView>(com.example.atry.R.id.display_image)


    upload_FAB.setOnClickListener {
        pickImageFromGallery()

    }



   camera_FAB.setOnClickListener{



       val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
       val frag = this
       /** Pass your fragment reference **/
       frag.startActivityForResult(
           intent,
           REQUEST_IMAGE_CAPTURE
       ) // REQUEST_IMAGE_CAPTURE = 12345


   }

    fun hasPermissionInManifest(context: Context, permissionName: String): Boolean {
        val packageName = context.packageName
        try {
            val packageInfo = context.packageManager
                .getPackageInfo(packageName, PackageManager.GET_PERMISSIONS)
            val declaredPermisisons = packageInfo.requestedPermissions
            if (declaredPermisisons != null && declaredPermisisons.size > 0) {
                for (p in declaredPermisisons) {
                    if (p == permissionName) {
                        return true
                    }
                }
            }
        } catch (e: PackageManager.NameNotFoundException) {

        }

        return false
    }





    v.backToHistory.setOnClickListener {
        backFragment()
    }
    // Inflate the layout for this fragment
    return v



}

private fun pickImageFromGallery() {
    //Intent to pick image
    val intent = Intent(Intent.ACTION_PICK)
    intent.type = "image/*"
    startActivityForResult(intent, IMAGE_PICK_CODE)
}

companion object {
    //image pick code
    private val IMAGE_PICK_CODE = 1000;
    //Permission code
    private val PERMISSION_CODE = 1001;
}








    private fun backFragment() {
        val manager = (context as AppCompatActivity).supportFragmentManager
        manager.popBackStackImmediate()
    }

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK && data !=null) {



if (requestCode == REQUEST_IMAGE_CAPTURE || requestCode== IMAGE_PICK_CODE) {
    // Do something with imagePath

    val extras = data.getExtras()
    val photo = extras.get("data") as Bitmap
    val imageView = view!!.findViewById<ImageView>(com.example.atry.R.id.display_image)
    imageView.setImageBitmap(photo)
    // CALL THIS METHOD TO GET THE URI FROM THE BITMAP
    var selectedImage = activity.let { getImageUri( it!!,photo) }
    val realPath = selectedImage.let { getRealPathFromURI(it) }
    selectedImage = Uri.parse(realPath)
}

    }

    super.onActivityResult(requestCode, resultCode, data)

}

fun getImageUri(inContext: Context, inImage: Bitmap): Uri {
    val bytes = ByteArrayOutputStream()
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes)
    val path =
        MediaStore.Images.Media.insertImage(inContext.contentResolver, inImage, "Title", null)
    return Uri.parse(path)
}

fun getRealPathFromURI(contentUri: Uri): String {
    var cursor: Cursor? = null
    try {
        val proj = arrayOf(MediaStore.Images.Media.DATA)
        cursor = getActivity()?.getContentResolver()?.query(contentUri, proj, null, null, null)
        val column_index = cursor!!.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
        cursor!!.moveToFirst()
        return cursor!!.getString(column_index)
    } finally {
        if (cursor != null) {
            cursor!!.close()
        }
    }
}

} `` `

Для захвата изображения все работает нормально, пока не появится экран, на котором я нажимаю на галочку, чтобы подтвердить, что картинка в порядке ... но затем я не могу что-либо просмотреть на ImageView.

Для кнопки загрузки, когда я нахожусь на экране, которая позволяет мне выбрать изображение ... при нажатии на него приложение вылетает и выдает следующую ошибку: java .lang.NullPointerException: попытка вызвать виртуальный метод 'java .lang.Object android .os.Bundle.get (java .lang.String)' для ссылки на нулевой объект

Я искал inte rnet в течение нескольких дней и не мог найти правильное решение для этого. Буду признателен, если кто-нибудь найдет мне решение этой проблемы.

1 Ответ

0 голосов
/ 19 января 2020

URI выбранного изображения возвращается не в Intent дополнениях, а в data из intent. Вы можете получить выбранное изображение URI следующим образом.

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (resultCode == Activity.RESULT_OK && data !=null) {
        if (requestCode == REQUEST_IMAGE_CAPTURE || requestCode== IMAGE_PICK_CODE) {
            // Get image URI From intent
            var imageUri = data.data
            // do something with the image URI
            your_image_view.setImageURI(imageUri)
        }
    }
    super.onActivityResult(requestCode, resultCode, data)
}
...