2016-10-30 2 views
-1

먼저이 질문을 여러 번 물어 보면 모든 내용을 읽고 시도했지만 슬프게도 성공할 수 없음을 알 수 있습니다. 나는 안드로이드 개발에 모든 초보자를 명확히하기 위해 다시 물어볼 필요가있다. BTW, 나는 배도에서 배웁니다. 자산에서 pdf 파일을 열려고합니다. 이 (cw-omnibus ContentProvider)이 매우 유용하지만 동적이 아니며 모든 pdfs에 대해이 동적을 만드는 방법을 알 수 없습니다. 기본적으로, 내가 버튼을 통해 pdf를 열고 싶을 때마다 cardview 등을 fileprovider와 함께 열어야합니다. 간단히 말해 FileProvider를 다른 이름으로 복사하여 붙여 넣을 수 있으며 사용할 수 있습니다. 하지만 20 pdfs 있다면, 내가 자바 파일을 많이해야합니다. 이것은 다른 도시로 가기 위해 버스를 이용하는 걷는 법과 같습니다. 나는 이것을 어떻게하는지 배우기 만하면된다. 나는 자바도 많이 모른다. 나는 버스를 타기 위해 많은 것들을 시도했지만 여전히 버스를 찾을 수 없었다. 도움이 필요해. github 예제에서는 "test.pdf"가 정적 인 것으로 나타났습니다. 의도가 "test.pdf"라고 불릴 때 열립니다. 나는 test.pdf에 대한 변수를 지루하게하는 것에 지쳐 있었고 cardView (버튼과 같은)에 대한 switch case를 시도했지만 FileProvider.java에서 변수를 호출 할 수 없었고 bla bla bla 많은 것을 피곤했다. (( 난 내가 recyclerview와 cardview을 수행 할 수 있습니다 알고 있지만 저를 잘 이해하고 내가 수동으로 cardviews을 만들도록 사용자 정의 할 수 알고 것이 어렵다 나는 아래의 모든 내 코드를 공유하고ContentProvider를 사용하는 자산에서 pdf 응용 프로그램으로 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()에 하나만 설정됩니다. 대신 onCreate()을 백그라운드 스레드로 포크하고 원하는만큼 많은 PDF를 설정할 수 있습니다. ContentProvider에있는 나머지 코드는 Uri에 제공된 파일 이름을 기준으로 getFilesDir()의 파일을 검색하기 때문에 변경하지 않아도됩니다.

+0

답변 해 주셔서 감사합니다. 실제로, 나는 할 수 없었습니다! 다른 블록을 FileProvider.java에 추가해야한다는 것을 알지 못합니다. 나는 많은 것을 시도했고 나는 또한 피곤했다. 나는 당신의 대답을 읽은 후에 무엇을해야하는지 외쳤다. 나는 안드로이드와 자바 모두를 코딩하는 것에 새로운 것이다. StremProvider의 경우 시간이 있으면 살펴볼 것입니다. 나는 그것을 거의 보지 않았고 medias를 열면 멋져 보인다. CommonsWare의 github 놀라운입니다. 또한, 위대한 근원에 대해 감사드립니다. – Feiyki

관련 문제