天天看點

記錄學習android遇到的坑

1.

Build command failed.

Error while executing process D:\AndroidSDK\cmake\3.6.4111459\bin\cmake.exe with arguments {--build E:\NK\AndroidProject\app\.externalNativeBuild\cmake\debug\arm64-v8a --target native-lib}

ninja: error: '../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libmy-lib.so', needed by '../../../../build/intermediates/cmake/debug/obj/arm64-v8a/libfdk-lib.so', missing and no known rule to make it

項目說明,我引用的cMake是在moudle裡面的,出現這個問題就表示連結時時候找不到對應架構的庫,是以我在modle裡面找到了這份cMakeLists.text檔案,檢視其中的内容發現沒有什麼錯誤是明顯能看到,畢竟是一大堆add..set...,于是我找到了配置ndk對應架構庫的build.gradle中發現對應的arm64-v8a這個so包并不存在build中的cmake/debug/obj中,是以我把配置的ndk架構庫删掉了arm64-v8a這個,再build就不報錯了,對應的,在build增加這個so庫我估計也能解決問題

2.

Manifest merger failed with multiple errors, see logs

項目是接手公司項目所引發的錯誤,發生這個錯誤時需要再terminal控制台中輸入gradlew processDebugManifest --stacktrace檢視,當輸入gradlew processDebugManifest --stacktrace時會出現錯誤資訊,我截了一點錯誤資訊如下:* What went wrong:

A problem occurred evaluating project ':DatePicker'.

> java.lang.UnsupportedClassVersionError: com/android/build/gradle/LibraryPlugin : Unsupported major.minor version 52.0

初看這個錯誤資訊狠疑惑,查了一下發現根本原因是JDK版本與gradle版本沒有對應上,對應的52.0的jdk對應版本應該是1.8,于是打開project Structure換上自己的jdk

記錄學習android遇到的坑

然後重新clean一下運作,發現沒問題了

3.

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

這個問題的出現是我在android中加載h5的頁面點選圖檔選擇或者拍照出現的的,根本的原因就是在android版本7.0之後Android不再允許在app中把file://Uri暴露給其他app,因為這樣事不安全的,是以geogle提供了解決方法給我們。

解決方法:

首先在

AndroidManifest.xml

中添加provider,配置屬性,

  • android:authorities

    是用來辨別provider的唯一辨別,在同一部手機上一個"authority"串隻能被一個app使用,沖突的話會導緻app無法安裝。
  • android:exported

    必須設定成

    false

    ,後面異常會講為什麼
  • android:grantUriPermissions

    用來控制共享檔案的通路權限,也可以在java代碼中設定
<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="{你的包名}.fileProvider"
            android:exported="false"
            android:grantUriPermissions="true"
            tools:replace="android:authorities">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
</provider>
           

當我們配置完provider後就可以修改代碼了

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            // android7.0注意uri的擷取方式改變
            Uri photoOutputUri = FileProvider.getUriForFile(
                    context,
                    BuildConfig.APPLICATION_ID + ".fileProvider",
                    new File(mCameraFilePath));
            intent2.putExtra(MediaStore.EXTRA_OUTPUT, photoOutputUri);
        } else {
            intent2.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mCameraFilePath)));
        }
           

異常處理

  • java.lang.SecurityException: Provider must not be exported

    解決方案:

    android:exported

    必須設定成

    false

  • Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference

    解決方案:

    AndroidManifest.xml

    處的

    android:authorities

    必須跟

    mActivity.getPackageName() + ".fileprovider"

    一樣