Android 7.0 당신 이 주의해 야 할 구덩이 들

7245 단어 Android
1. apk 설치 오류: android. os. FileUriExposedException
1. AndroidMainifest. xml 파일 에 추가:
<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
provider>

authorities: app 의 패키지 이름. fileProvider grantUriPermissions: true, URI 임시 접근 권한 exported: false resource: 다음 에 추 가 된 파일 을 표시 합 니 다.
2. res 아래 xml 라 는 파일 가 를 새로 만 들 고 파일 provider 를 새로 만 듭 니 다.paths:

<paths>
    <external-path
        name="files_root"
        path="Android/data/com.example.downloadapk/"/>
    <external-path
        name="external_storage_root"
        path="."/>
paths>

path: 임시 권한 이 필요 한 접근 경로 (. 모든 경 로 를 대표 함) name: 접근 경로 이름
3. apk 파일 설치:
   /**
     *   apk  
     *
     * @param apkFile        
     */
    private void installApk(File apkFile) {
        Intent intent = new Intent(Intent.ACTION_VIEW);
        try {
            String[] command = {"chmod", "777", apkFile.toString()};
            ProcessBuilder builder = new ProcessBuilder(command);
            builder.start();
        } catch (IOException ignored) {
        }

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            Uri contentUri = FileProvider.getUriForFile(getApplicationContext(),
                    BuildConfig.APPLICATION_ID + ".fileProvider", apkFile);
            intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
        } else {
            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }

        startActivity(intent);
    }

2. 시스템 카메라 충돌 해결 android. os. FileUriExposedException
1. 우선 AndroidManifest. xml 에서 설명 합 니 다.
    <provider
        android:name=".ImagePickerProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    provider>

2 、 provider 만 들 기paths. xml 파일 은 res 폴 더 아래 xml 폴 더 아래 에 있 습 니 다.
res/xml/provider_paths.xml

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
paths>

3. 적당 한 곳 에서 교체 하기
                Uri uri;
                if (VERSION.SDK_INT <= VERSION_CODES.M){
                    uri = Uri.fromFile(takeImageFile);
                }else{
                    /**
                     * 7.0               Uri  ,     FileProvider
                     *         MIUI       size 0   
                     */
                    uri = FileProvider.getUriForFile(activity, ProviderUtil.getFileProviderName(activity), takeImageFile);
                }

                Log.e("nanchen",ProviderUtil.getFileProviderName(activity));
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
import android.content.Context;

/**
 *     provider   util
 *
 * Date: 2017-03-23  12:21
 */

public class ProviderUtil {

    public static String getFileProviderName(Context context){
        return context.getPackageName()+".provider";
    }
}

좋은 웹페이지 즐겨찾기