Во-первых, я знаю, что этот вопрос задал много раз, и вы можете быть уверены, что я прочитал и попробовал все, но я не смог добиться успеха с грустью. Мне нужно попросить еще раз пояснить всех новичков в разработке Android. Кстати, я учусь от udacity. Я пытаюсь открыть pdf-файлы из активов. Я нашел это (cw-omnibus ContentProvider), и это очень полезно, но это не динамично, и я не мог понять, как сделать эту динамику для всех PDF-файлов. В основном, всякий раз, когда я хочу открыть pdf-файл с помощью кнопки, cardview и так далее, он должен открыть его с помощью fileprovider. Просто я могу скопировать и вставить FileProvider с другим именем, и я могу его использовать. Но если у меня 20 pdf, у меня будет много java-файла. Это похоже на прогулку, чтобы использовать автобус, чтобы отправиться в другой город. Я просто хочу научиться этому, как это сделать. Я тоже не знаю java. Я пробовал много вещей, чтобы сесть на автобус, но все равно я не мог найти автобус. Мне нужна помощь. В примере github есть «test.pdf», как вы видите. Когда намерение называется «test.pdf», открывается. Я устал воспринимать переменную для test.pdf и попробовал футляр для карт (например, кнопка), но я не мог назвать переменную из FileProvider.java, и я устал от bla bla bla много чего. : (( Я знаю, что я могу сделать cardview с recyclerview, но это трудно для меня право знать, чтобы понять и настроить так, что я вручную создал cardviews Я делюсь все мои коды нижеКак открыть pdf-файл с любым PDF-приложением из активов, используя ContentProvider
XML
<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
android:background="@color/colorBg"
android:fillViewport="true"
tools:context="com.example.tk.buzebv2.Hizmetlerimiz">
<LinearLayout xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/activity_kilavuzlar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin">
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_clicked1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/card_view_bottom"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:onClick="onClick"
card_view:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:id="@+id/imageView2"
android:layout_width="match_parent"
android:layout_height="150dp"
android:scaleType="centerCrop"
android:src="@drawable/hizmetlerimiz1" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:text="Uzaktan Öğretim Sınıfı"
android:textColor="@color/colorDefaultText"
android:textSize="24sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="left"
android:lineSpacingMultiplier="1.3"
android:padding="@dimen/activity_horizontal_margin"
android:text="@string/hakkimizda_aciklama1"
android:textColor="@color/colorDefaultText"
android:textSize="16sp" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_clicked2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/card_view_bottom"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:onClick="onClick"
card_view:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:scaleType="centerCrop"
android:src="@drawable/hizmetlerimiz2" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:text="Uzaktan Öğretim Hizmetleri"
android:textColor="@color/colorDefaultText"
android:textSize="24sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="left"
android:lineSpacingMultiplier="1.3"
android:padding="@dimen/activity_horizontal_margin"
android:text="@string/hakkimizda_aciklama3"
android:textColor="@color/colorDefaultText"
android:textSize="16sp" />
</LinearLayout>
</android.support.v7.widget.CardView>
<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_clicked3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="@dimen/card_view_bottom"
android:clickable="true"
android:foreground="?android:attr/selectableItemBackground"
android:onClick="onClick"
card_view:cardCornerRadius="4dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="150dp"
android:scaleType="centerCrop"
android:src="@drawable/hizmetlerimiz3" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingTop="16dp"
android:text="Online Sınav Hizmetleri"
android:textColor="@color/colorDefaultText"
android:textSize="24sp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:gravity="left"
android:lineSpacingMultiplier="1.3"
android:padding="@dimen/activity_horizontal_margin"
android:text="@string/hakkimizda_aciklama3"
android:textColor="@color/colorDefaultText"
android:textSize="16sp" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLayout>
</ScrollView>
..
JAVA
package com.example.tk.buzebv2;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.CardView;
import android.util.Log;
import android.view.View;
public class Hizmetlerimiz extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hizmetlerimiz);
CardView b1= (CardView) findViewById(R.id.card_clicked1);
CardView b2= (CardView) findViewById(R.id.card_clicked2);
CardView b3= (CardView) findViewById(R.id.card_clicked3);
b1.setOnClickListener(this);
b2.setOnClickListener(this);
b3.setOnClickListener(this);
}
public void onClick(View v) {
int i = v.getId();
if (i == R.id.card_toast) {
String hizmet_01 = "hizmet_01_a201.pdf";
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse(FileProvider.CONTENT_URI
+ hizmet_01)));
} else if (i == R.id.card_toast1) {
String hizmet_02 = "hizmet_02_distance.pdf";
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse(FileProvider.CONTENT_URI
+ hizmet_02)));
} else if (i == R.id.card_toast2) {
String hizmet_03 = "hizmet_03_online_sinav.pdf";
startActivity(new Intent(Intent.ACTION_VIEW,
Uri.parse(FileProvider.CONTENT_URI
+ hizmet_03)));
}
}
}
FileProvider.java
/***
Copyright (c) 2008-2014 CommonsWare, LLC
Licensed under the Apache License, Version 2.0 (the "License"); you may not
use this file except in compliance with the License. You may obtain a copy
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
OF ANY KIND, either express or implied. See the License for the specific
language governing permissions and limitations under the License.
From _The Busy Coder's Guide to Android Development_
https://commonsware.com/Android
*/
package com.commonsware.android.cp.files;
import android.content.res.AssetManager;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
import android.util.Log;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileProvider extends AbstractFileProvider {
public static final Uri CONTENT_URI=
Uri.parse("content://com.commonsware.android.cp.files/");
@Override
public boolean onCreate() {
File f=new File(getContext().getFilesDir(), "test.pdf");
if (!f.exists()) {
AssetManager assets=getContext().getResources().getAssets();
try {
copy(assets.open("test.pdf"), f);
}
catch (IOException e) {
Log.e("FileProvider", "Exception copying from assets", e);
return(false);
}
}
return(true);
}
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode)
throws FileNotFoundException {
File root=getContext().getFilesDir();
File f=new File(root, uri.getPath()).getAbsoluteFile();
if (!f.getPath().startsWith(root.getPath())) {
throw new
SecurityException("Resolved path jumped beyond root");
}
if (f.exists()) {
return(ParcelFileDescriptor.open(f, parseMode(mode)));
}
throw new FileNotFoundException(uri.getPath());
}
@Override
protected long getDataLength(Uri uri) {
File f=new File(getContext().getFilesDir(), uri.getPath());
return(f.length());
}
// following is from ParcelFileDescriptor source code
// Copyright (C) 2006 The Android Open Source Project
// (even though this method was added much after 2006...)
private static int parseMode(String mode) {
final int modeBits;
if ("r".equals(mode)) {
modeBits=ParcelFileDescriptor.MODE_READ_ONLY;
}
else if ("w".equals(mode) || "wt".equals(mode)) {
modeBits=
ParcelFileDescriptor.MODE_WRITE_ONLY
| ParcelFileDescriptor.MODE_CREATE
| ParcelFileDescriptor.MODE_TRUNCATE;
}
else if ("wa".equals(mode)) {
modeBits=
ParcelFileDescriptor.MODE_WRITE_ONLY
| ParcelFileDescriptor.MODE_CREATE
| ParcelFileDescriptor.MODE_APPEND;
}
else if ("rw".equals(mode)) {
modeBits=
ParcelFileDescriptor.MODE_READ_WRITE
| ParcelFileDescriptor.MODE_CREATE;
}
else if ("rwt".equals(mode)) {
modeBits=
ParcelFileDescriptor.MODE_READ_WRITE
| ParcelFileDescriptor.MODE_CREATE
| ParcelFileDescriptor.MODE_TRUNCATE;
}
else {
throw new IllegalArgumentException("Bad mode '" + mode + "'");
}
return modeBits;
}
}
Большое вам спасибо за ваш ответ. На самом деле, я не мог понять, что просто должен добавить еще один блок в FileProvider.java. Я пробовал много вещей, и я тоже устал, если еще :). Я выяснил, что я должен сделать после прочтения вашего ответа. Я новичок в кодировании вообще для android и java. Для StremProvider я буду изучать его, когда у меня будет время. Я едва посмотрел на него, и он отлично выглядит, чтобы открыть медиа. Github CommonsWare потрясающий. Также, спасибо за такой замечательный источник. – Feiyki