簡體   English   中英

onRequestPermission / onActivityResult Android Studio 出錯

[英]Error with onRequestPermission / onActivityResult Android Studio

我在 Android Studio 中的應用程序出現錯誤。 請檢查我的代碼。 btnChoose 不起作用..,當我按下按鈕時,請求訪問電話庫的權限。 但不要進入手機圖庫選擇圖像。 請幫我! 謝謝!

主要 java 代碼 - MainFragment:

package com.example.licenta23;

import android.Manifest;
import android.app.AppComponentFactory;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

public class MainFragment extends Fragment {

private static final String[] CAROSERIE = new String[] {
        "Cabrio", "Berlina", "Coupe", "Pick-up", "Hatchback", "Break", "Off-road", "Minibus", "Monovolum", "SUV"
};

private static final String[] COMBUSTIBIL = new String[] {
        "Benzina", "Diesel", "GPL", "Electric", "Hibrid"
};

private static final String[] CULOARE = new String[] {
        "Alb", "Negru", "Gri", "Argintiu", "Albastru", "Rosu", "Verde", "Auriu", "Galben", "Portocaliu", "Maro", "Bej", "Alta culoare"
};


private List<MarcaItem> marcaList;

EditText actv1, edtModel, actv2, actv3, actv4, edtFabricatie, edtPret;
Button btnChoose, btnAdd, btnList;
ImageView imageView3;

final int REQUEST_CODE_GALLERY = 999;

public static SQLiteHelper sqLiteHelper;




@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_main, container, false);


    fillMarcaList();


    AutoCompleteTextView editText = view.findViewById(R.id.actv1);
    AutoCompleteMarcaAdapter adapter = new AutoCompleteMarcaAdapter(getActivity(), marcaList);
    editText.setAdapter(adapter);

    AutoCompleteTextView editText2 = view.findViewById(R.id.actv2);
    ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, CAROSERIE);
    editText2.setAdapter(adapter2);

    AutoCompleteTextView editText3 = view.findViewById(R.id.actv3);
    ArrayAdapter<String> adapter3 = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, COMBUSTIBIL);
    editText3.setAdapter(adapter3);

    AutoCompleteTextView editText4 = view.findViewById(R.id.actv4);
    ArrayAdapter<String> adapter4 = new ArrayAdapter<String>(getActivity(),
            android.R.layout.simple_list_item_1, CULOARE);
    editText4.setAdapter(adapter4);

    init(view);

    sqLiteHelper = new SQLiteHelper(getActivity(),"CarDB.sqlite", null, 1);

    sqLiteHelper.queryData("CREATE TABLE IF NOT EXISTS CAR (Id INTEGER PRIMARY KEY AUTOINCREMENT, alegemarca VARCHAR, model VARCHAR, caroserie VARCHAR, combustibil VARCHAR, culoare VARCHAR, fabricatie VARCHAR, pret VARCHAR, image BLOG)");

    btnChoose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ActivityCompat.requestPermissions(
                    getActivity(),
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_CODE_GALLERY
            );
        }
    });







    return view;
}

private void fillMarcaList() {
    marcaList = new ArrayList<>();
    marcaList.add(new MarcaItem("Alfa Romeo", R.drawable.alfa_romeo));
    marcaList.add(new MarcaItem("Audi", R.drawable.audi));
    marcaList.add(new MarcaItem("Bmw", R.drawable.bmw));
    marcaList.add(new MarcaItem("Chevrolet", R.drawable.chevrole));
    marcaList.add(new MarcaItem("Citroen", R.drawable.citroen));
    marcaList.add(new MarcaItem("Dacia", R.drawable.dacia));
    marcaList.add(new MarcaItem("Dodge", R.drawable.dodge));
    marcaList.add(new MarcaItem("Fiat", R.drawable.fiat));
    marcaList.add(new MarcaItem("Ford", R.drawable.ford));
    marcaList.add(new MarcaItem("Honda", R.drawable.honda));
    marcaList.add(new MarcaItem("Hyundai", R.drawable.hyundai));
    marcaList.add(new MarcaItem("Jaguar", R.drawable.jaguar));
    marcaList.add(new MarcaItem("Jeep", R.drawable.jeep));
    marcaList.add(new MarcaItem("Kia", R.drawable.kia));
    marcaList.add(new MarcaItem("Land Rover", R.drawable.landrover));
    marcaList.add(new MarcaItem("Lexus", R.drawable.lexus));
    marcaList.add(new MarcaItem("Mazda", R.drawable.mazda));
    marcaList.add(new MarcaItem("Mercedes-Benz", R.drawable.mercedes));
    marcaList.add(new MarcaItem("Mini Cooper", R.drawable.minicooper));
    marcaList.add(new MarcaItem("Mitsubishi", R.drawable.mitsubishi));
    marcaList.add(new MarcaItem("Nissan", R.drawable.nissan));
    marcaList.add(new MarcaItem("Opel", R.drawable.opel));
    marcaList.add(new MarcaItem("Peugeot", R.drawable.peugeot));
    marcaList.add(new MarcaItem("Pontiac", R.drawable.pontiac));
    marcaList.add(new MarcaItem("Porche", R.drawable.porche));
    marcaList.add(new MarcaItem("Renault", R.drawable.renault));
    marcaList.add(new MarcaItem("Rover", R.drawable.rover));
    marcaList.add(new MarcaItem("Seat", R.drawable.seat));
    marcaList.add(new MarcaItem("Skoda", R.drawable.skoda));
    marcaList.add(new MarcaItem("Smart", R.drawable.smart));
    marcaList.add(new MarcaItem("Subaru", R.drawable.subaru));
    marcaList.add(new MarcaItem("Suzuki", R.drawable.suzuki));
    marcaList.add(new MarcaItem("Toyota", R.drawable.toyota));
    marcaList.add(new MarcaItem("Voltwagen", R.drawable.voltwagen));
    marcaList.add(new MarcaItem("Volvo", R.drawable.volvo));

}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    if(requestCode == REQUEST_CODE_GALLERY){
        if(grantResults.length >0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent, REQUEST_CODE_GALLERY);
        }
        else {
            Toast.makeText(getActivity().getApplicationContext(), "You don't have permission to access file location!", Toast.LENGTH_SHORT).show();
        }
        return;
    }

    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if(requestCode == REQUEST_CODE_GALLERY && resultCode == getActivity().RESULT_OK && data != null){
        Uri uri = data.getData();

        try {
            InputStream inputStream = getActivity().getApplicationContext().getContentResolver().openInputStream(uri);

            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            imageView3.setImageBitmap(bitmap);

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

    super.onActivityResult(requestCode, resultCode, data);
}


private void init(View view) {
    actv1 = view.findViewById(R.id.actv1);
    edtModel = view.findViewById(R.id.edtModel);
    actv2 = view.findViewById(R.id.actv2);
    actv3 = view.findViewById(R.id.actv3);
    actv4 = view.findViewById(R.id.actv4);
    edtFabricatie = view.findViewById(R.id.edtFabricatie);
    edtPret = view.findViewById(R.id.edtPret);
    btnChoose = view.findViewById(R.id.btnChoose);
    btnAdd = view.findViewById(R.id.btnAdd);
    btnList = view.findViewById(R.id.btnList);
    imageView3 = view.findViewById(R.id.imageView3);
}

}

調試器不會給我任何錯誤...

ZAIN 更新

btnChoose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String[] permissions =  new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
                return;

            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(permissions, REQUEST_CODE_GALLERY); // triggers onRequestPermissionsResult() each time a permission is granted in 'permissions'
                } else {
                    Toast.makeText(getActivity(), "Permission Already Granted", Toast.LENGTH_SHORT).show();
                }
            }
        }
    });

我的代碼可以嗎?

我瀏覽了您的代碼,似乎沒有錯,並且由於沒有引發異常,因此以編程方式獲得所需的權限沒有問題; 因此,請嘗試從清單文件中請求許可,僅以編程方式提供它是行不通的

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

更新:

嘗試替換以下代碼段以手動請求權限。

所以刪除下面:

    btnChoose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            ActivityCompat.requestPermissions(
                    getActivity(),
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    REQUEST_CODE_GALLERY
            );
        }
    });

並將其替換為:

    btnChoose.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String[] permissions =  new String[]{Manifest.permission.READ_EXTERNAL_STORAGE};

            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M)
                return;

            for (String permission : permissions) {
                if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(permissions, code); // triggers onRequestPermissionsResult() each time a permission is granted in 'permissions'
                } else {
                    Toast.makeText(this, "Permission Already Granted", Toast.LENGTH_SHORT).show();


                    Intent intent = new Intent(Intent.ACTION_PICK);
                    intent.setType("image/*");
                    startActivityForResult(intent, REQUEST_CODE_GALLERY);
                }
            }
        }
    });

一切似乎都很好,除了您請求片段的許可並在片段中聲明回調。

但是當用戶提示權限並允許/拒絕該權限時,回調首先會轉到您的活動上下文而不是您的片段上下文。

所以首先你必須在你的活動中聲明onRequestPermissionsResult()並且從活動中你必須將它傳遞給你的片段,然后在你的片段的onRequestPermissionsResult()將在隊列中工作。

onActivityResult()也遵循相同的過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM