FileProvider 學習筆記

1.FileProvider 繼承Provider

2.使用步驟:

    1.在項目 res/xml 裏面新建一個 paths.xml 文件 

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path
        name="images/"
        path="testimages" />
</paths>

2.在manifest 裏面聲明一個FileProvider

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="cn.uflycn.com.providerdemo.fileprovider"// uri 
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/paths" />
        </provider>

3.使用這個provider 下面舉個栗子 使用這個fileprovider 打開系統拍照 顯示圖片

 

package cn.uflycn.com.providerdemo;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_TAKEPHOTO_CODE = 0;
    private String mPhotoPath;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                takePhoto();
            }
        });
    }

    void takePhoto() {
        Intent takePhotoIntent = new Intent();
        takePhotoIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {
            String fileName = new SimpleDateFormat("yyyyMMdd-HHmmss", Locale.CHINA).
                    format(new Date()) + ".png";
            //如果  文件夾不存在 會出現拍照無法返回
            // 如果文件路徑錯了 會報錯
            File file = new File(Environment.getExternalStorageDirectory() + File.separator + "testimages"+ File.separator + fileName);
            if(!file.exists()){
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            mPhotoPath = file.getAbsolutePath();
            Uri fileUri = FileProvider.getUriForFile(this, "cn.uflycn.com.providerdemo.fileprovider", file);
            takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
            takePhotoIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            startActivityForResult(Intent.createChooser(takePhotoIntent,"拍照"), REQUEST_TAKEPHOTO_CODE);
        }
    }

//demo未考慮 耗時問題
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode,resultCode,data);
        if (requestCode == REQUEST_TAKEPHOTO_CODE) {
            if (resultCode == RESULT_OK) {
                ImageView imageView = findViewById(R.id.imageView);
                Bitmap bitmap = BitmapFactory.decodeFile(mPhotoPath);
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章