2016-10-30 8 views
-1

まず、私はこの質問を何度も聞いたことがあり、私はそれらをすべて読んで試してみることができますが、悲しいことに成功できませんでした。私はアンドロイド開発のすべての初心者のために明確にするように再度尋ねる必要があります。ところで、私はudacityから学んでいます。 私は資産からPDFファイルを開こうとしています。私はこれ(cw-omnibus ContentProvider)を見つけましたが、これは非常に役に立ちますが、動的ではなく、すべてのpdfsに対してこの動的な方法を理解できませんでした。基本的に、私はボタンを介してpdfを開くには、cardviewなどを開くには、fileproviderを使用して開く必要があります。 単に、別の名前でFileProviderをコピー&ペーストすることができます。しかし、私は20 pdfを持っている場合、私は多くのJavaファイルを持っています。これはバスを使って別の都市に行くための散歩のようなものです。私はそれをする方法を学ぶことができません。私はJavaもよく知らない。私はバスに乗ろうと多くのことを試みたが、それでも私はバスを見つけることができなかった。私はいくつかの助けが必要です。 githubの例では、 "test.pdf"が静的であることがわかります。意図が「test.pdf」と呼ばれるときに開かれます。私はtest.pdfの変数を詰め込むのにうんざりし、cardview(ボタンのような)のswitch caseを試しましたが、FileProvider.javaから変数を呼び出すことができず、たくさんの事が疲れました。 :(( 私はrecyclerviewとcardviewを行うことができます知っているが、私は右ので、私は手動でcardviewsを作成したことを理解し、カスタマイズするために知っていることは困難である 私は、以下のすべての私のコードを共有していますContentProviderを使用して資産からpdfアプリを開く方法

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; 
    } 
} 

答えて

0

最も簡単なことは、my StreamProviderを使用することです。これは、このすべてをあなたのために処理します。 Androidサポートライブラリで提供されているFileProviderに基づいていますが、見た特定のサンプルアプリケーションで作成された介在コピーを使わずに直接アセットからファイルを提供しています。

それ以外の場合は、そこにあるサンプルは任意の数のPDFを処理します。 onCreate()に1つしか設定されていません。代わりにonCreate()にバックグラウンドスレッドをフォークし、必要な数のPDFを設定することができます。 ContentProviderのコードの残りの部分は、Uriで提供されたファイル名に基づいてgetFilesDir()のファイルを検索するだけで、変更する必要はありません。

+0

ありがとうございました。実際には、私はできませんでした!私はFileProvider.javaに別のifブロックを追加するだけでよいことに気づきません。私はたくさんのことを試していましたし、他にも疲れていました。私はあなたの答えを読んだ後に何をしたらいいのか分かりませんでした。私はアンドロイドとjavaの両方でコーディングに新しいです。 StremProviderの場合、私は時間があるときにそれを調べます。私はほとんどそれを見て、それはメディアを開くために素晴らしいです。 CommonsWareのgithubは素晴らしいです。また、そのような素晴らしい情報源に感謝します。 – Feiyki

関連する問題