Вылетает приложение при запросе доступа к хранилищу
Делаю PDF Reader, но почему-то вылетает. Буду благодарен за помощь!
MainActivity.class
public class MainActivity extends AppCompatActivity {
RecyclerView recView_pdf;
private ArrayList<File> list_files = new ArrayList<File>();
ArrayAdapter<File> adapter;
File folder;
String[] items;
private final int REQUEST_PERMISSION = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
permission();
} else {
initView();
}
}
private void permission() {
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
&& ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
Toast.makeText(this, "Please grant permission", Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);
} else {
Toast.makeText(this, "You have already granted permission", Toast.LENGTH_SHORT).show();
initView();
}
}
private void initView() {
folder = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
list_files = getPdfFiles(folder);
ArrayList<File> list_files2 = getPdfFiles(Environment.getExternalStorageDirectory());
items = new String[list_files2.size()];
for(int i = 0; i < items.length; i++){
items[i] = String.valueOf(list_files2.get(i).getName().endsWith(".pdf"));
}
PDFAdapter pdfAdapter = new PDFAdapter(this, list_files, items);
recView_pdf.setAdapter(pdfAdapter);
recView_pdf.setLayoutManager(new LinearLayoutManager(this, RecyclerView.VERTICAL, false));
}
private ArrayList<File> getPdfFiles(File folder) {
ArrayList<File> list_files1 = new ArrayList<File>();
File[] files = folder.listFiles();
if(files != null){
for(File itemFile : files){
if(itemFile.isDirectory() && !itemFile.isHidden()){
list_files1.addAll(getPdfFiles(itemFile));
} else {
if(itemFile.getName().endsWith(".pdf")){
list_files1.add(itemFile);
}
}
}
}
return list_files1;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(requestCode == REQUEST_PERMISSION){
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "You already permission", Toast.LENGTH_SHORT).show();
initView();
}else{
Toast.makeText(this, "Please press Allow to continue", Toast.LENGTH_SHORT).show();
}
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recView_pdf"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
PDFAdapter.class
public class PDFAdapter extends RecyclerView.Adapter<PDFAdapter.MyViewHolder> {
private Context context;
private ArrayList<File> list_files;
String[] items;
public PDFAdapter(Context context, ArrayList<File> list_files, String[] items){
this.context = context;
this.list_files = list_files;
this.items = items;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.pdf_adapter, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.textView_pdfName.setText(items[position]);
}
@Override
public int getItemCount() {
return list_files.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView_pdfName;
ImageView imageView_pdfIcon;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView_pdfName = itemView.findViewById(R.id.textView_pdfName);
imageView_pdfIcon = itemView.findViewById(R.id.imageView_pdfIcon);
}
}
}
pdf_adapter.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView_pdfIcon"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="5dp"
android:src="@drawable/pdf_icon"/>
<TextView
android:id="@+id/textView_pdfName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="File name"
android:textSize="16dp"
android:textColor="#353535"
android:layout_toRightOf="@+id/imageView_pdfIcon"
android:layout_marginLeft="20dp"
android:maxLines="1"
android:layout_centerVertical="true"
android:gravity="center"
/>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="wyspa.example.com.pdfreader">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.PDFReader">
<activity android:name=".PDFOpener"></activity>
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Вкладка run
12/15 15:09:20: Launching 'app' on Physical Device.
App restart successful without requiring a re-install.
$ adb shell am start -n "wyspa.example.com.pdfreader/wyspa.example.com.pdfreader.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Connected to process 26584 on device 'xiaomi-mi_4-896767e3'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
W/e.com.pdfreade: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (greylist, reflection, allowed)
W/e.com.pdfreade: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (greylist, reflection, allowed)
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: wyspa.example.com.pdfreader, PID: 26584
java.lang.RuntimeException: Unable to start activity ComponentInfo{wyspa.example.com.pdfreader/wyspa.example.com.pdfreader.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
at wyspa.example.com.pdfreader.MainActivity.initView(MainActivity.java:75)
at wyspa.example.com.pdfreader.MainActivity.permission(MainActivity.java:58)
at wyspa.example.com.pdfreader.MainActivity.onCreate(MainActivity.java:42)
at android.app.Activity.performCreate(Activity.java:7824)
at android.app.Activity.performCreate(Activity.java:7813)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:491)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Ответы (1 шт):
Автор решения: Andrew
→ Ссылка
Если я правильно понял, то ваша ошибка выглядит так:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setAdapter(androidx.recyclerview.widget.RecyclerView$Adapter)' on a null object reference
это означает что вы пытаетесь обратится к виджету которому не присвоено какое-то значение. Делаете вы это судя по коду здесь:
recView_pdf.setAdapter(pdfAdapter);
вам нужно перед это строкой вставить такую строку:
recView_pdf = findViewById(R.id.recView_pdf);
дальше после инициализации виджета:
recView_pdf.setLayoutManager(new LinearLayoutManager(this));
recView_pdf.setAdapter(new PDFAdapter(this, list_files, items));
Так же я бы вам советовал убрать нижнее подчеркивание у наименования переменной, так как это немного противоречит правилам именования переменных в Java Naming Conventions.