Android開發各類常見錯誤解決方案(不斷更新中)

本文屬于個人平時項目開發過程遇到的一些問題,記錄下來并總結解決方案,希望能幫到大家解決問題,有些問題的解決方案是在StackoverFlow上找到的,建議大家遇到問題多去上面找,基本上都能找到解決方案的。

(1)將Eclipse項目導入到Android studio 中 很多點9圖出現問題解決方法:
在build.gradle里添加以下兩句:

aaptOptions.cruncherEnabled = false     
aaptOptions.useNewCruncher = false

用來關閉Android Studio的PNG合法性檢查的,直接不讓它檢查。

(2)Android Studio 錯誤: 非法字符: '\ufeff' 解決方案|錯誤: 需要class, interface或enum

  • 原因:
    Eclipse可以智能的把UTF-8+BOM文件轉為普通的UTF-8文件,Android Studio還沒有這個功能,所以使用Android Studio編譯UTF-8+BOM編碼的文件時會出現” 非法字符: '\ufeff' “之類的錯誤

  • 解決方法:
    手動將UTF-8+BOM編碼的文件轉為普通的UTF-8文件。**
    **用EdItPlus打開.java文件依次:文檔》文本編輯》轉換文本編碼》選擇UTF-8編碼即可

(3)將項目導入到AS中出現以下問題:

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'. > com.android.bui
  • 解決方法:
    在build.grade中添加以下代碼:
android{
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
          }
}

(4)未知錯誤

Error:Timeout waiting to lock cp_proj class cache for build file '/Users/Mr.xiao/Desktop/AndroidShopNC2014MoblieNew/androidShopNC2014Moblie/build.gradle' 
(/Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj).
It is currently in use by another Gradle instance.
Owner PID: unknown
Our PID: 1412
Owner Operation: unknown
Our operation: Initialize cache
Lock file: /Users/Mr.xiao/.gradle/caches/2.10/scripts/build_3cyr7hzjurcc62ge3ixidshos/cp_proj/cache.properties.lock
  • 解決方案
    以上是錯誤提示。
    解決的思路很簡單只需要把cache.properties.lock文件刪除了就可以了。當時我們刪除的時候會被占用這時候需要進入任務管理器結束關于java的進程就行比如 java 的jdk 刪除后重啟讓java jdk啟動 啟動Android Studio就能啟動APK了。

(5)修改了Android項目的最小SDK版本之后出現很多stysle文件找不到

  • 解決方案
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "net.mmloo2014.android"
minSdkVersion 14
targetSdkVersion 23
}

compileSdkVersion 是多少版本的

那么compile 'com.android.support:appcompat-v7:23.2.1’ 就是啥版本的。

(6)Android studio 編譯問題:finished with non-zero exit value 2

  • 問題:
Error:Execution failed for task ':androidShopNC2014Moblie:transformClassesWithDexForDebug'.
>
com.android.build.api.transform.TransformException: 
com.android.ide.common.process.ProcessException: 
java.util.concurrent.ExecutionException: 
com.android.ide.common.process.ProcessException: 
org.gradle.process.internal.ExecException: 
Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 2
  • 解決方案
    這個錯誤在app的build.gradle里面添加下面這句就好了。
android { 
defaultConfig { 
multiDexEnabled true
      }
}

(7)Android studio 編譯問題:finished with non-zero exit value 1(由于導入的依賴出現重復造成的)

  • 問題:
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.

> com.[Android](http://lib.csdn.net/base/15).build.api.transform.TransformException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'F:\Program Files (x86)\[Java](http://lib.csdn.net/base/17)\jdk1.8.0_31\bin\java.exe'' finished with non-zero exit value 1
  • 解決方案
    這個是因為依賴包重復了 (像v4和nineoldandroids),app中實現了對easeUI的依賴,但是app和easeUI都添加了對這個包的依賴。所以就報這個錯誤,修改之后再報,就clean,rebuild一下。

(8)問題

Error:Execution failed for task 
':app:transformClassesWithJarMergingForDebug'.> 
com.android.build.api.transform.TransformException: 
java.util.zip.ZipException:
 duplicate entry: org/apache/http/ConnectionClosedException.class
  • 解決方案
    這個是在我們啟動的時候報錯的,而不是在編譯的時候,原因是這樣的,報這個錯是因為有2個庫中存在相同的類。大家可以看到stackoverflow上有人也提了這樣的問題。只需要刪除其中的一個就可以解決了。

(9)添加第三方依賴出現的問題

Error:Execution failed for task ':app:processDebugManifest'.
> 
Manifest merger failed :
 uses-sdk:minSdkVersion 14 cannot be smaller than version 19 declared in library [com.github.meikoz:basic:2.0.3] 
/AndroidStudioCode/EnjoyLife/app/build/intermediates/exploded-aar/
com.github.meikoz/basic/2.0.3/AndroidManifest.xml
Suggestion: use tools:overrideLibrary="com.android.core" to force usage
  • 錯誤原因
    出現這個錯誤的原因是我引入的第三方庫最低支持版本高于我的項目的最低支持版本,異常中的信息顯示:我的項目的最低支持版本為14,而第三方庫的最低支持版本為19,所以拋出了這個異常。

  • 解決方案
    在AndroidManifest.xml文件中標簽中添加

<uses-sdk tools:overrideLibrary="xxx.xxx.xxx"/>

其中的xxx.xxx.xxx為第三方庫包名,如果存在多個庫有此異常,則用逗號分割它們,例如:

<uses-sdk tools:overrideLibrary="xxx.xxx.aaa, xxx.xxx.bbb"/>

這樣做是為了項目中的AndroidManifest.xml和第三方庫的AndroidManifest.xml合并時可以忽略最低版本限制。

(10)Android studio 編譯問題:finished with non-zero exit value 1(由于buildtools版本太高造成的)

  • 錯誤
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.ide.common.process.ProcessException: 
org.gradle.process.internal.ExecException: 
Process 'command '/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home/bin/java'' finished with non-zero exit value 1
  • 錯誤原因
    buildToolsVersion版本太高,我原來的 buildToolsVersion "24.0.0” 需要jdk1.8,而我的是jdk1.7,所以一直報這個錯,剛開始以為是v4包和V7包沖突,因為之前遇到這樣的問題,而這次刪除V4包之后依然報這個錯,上stackoverflow搜了一下,把buildTools版本降下來就好了。

  • 解決方案

android {    
compileSdkVersion 23    
buildToolsVersion "23.0.3"  
}

(11)Android studio 編譯問題:Gradle DSL not found 'android()'

  • 問題
clipboard.png
  • 解決方案
  • 配置build.gradle:
buildscript {
repositories {   
jcenter()
}
    
dependencies {   
classpath 'com.android.tools.build:gradle:2.1.2'
   }
}

allprojects {  
repositories {    
jcenter()
   }
}
buildscript {
repositories {      
jcenter()
}
    
dependencies {
classpath 'com.android.tools.build:gradle:2.1.2'
    }
}


allprojects {
repositories {
jcenter()
    }
}
  • 配置app/build.gradle:
apply plugin: 'com.android.application'android { 
compileSdkVersion 23
 buildToolsVersion '23.0.3' 
defaultConfig { 
minSdkVersion 9 
targetSdkVersion 23 
versionCode 1 
versionName '1.0' 
             }
}
dependencies { 
compile 'com.android.support:appcompat-v7:23.2.1'
}

最后再同步一下sync即可。

(12)Android studio 編譯問題:Gradle DSL not found 'android()'

  • 問題描述
Error:(51, 52) 錯誤: -source 1.6 中不支持 diamond 運算符
(請使用 -source 7 或更高版本以啟用 diamond 運算符)

  • 解決方案
  • 方案一
將標紅處設置為1.7.png
修改soure為1.7.png
  • 方案二
    在build gradle中進行配置如下代碼:
android {
 compileOptions {
 sourceCompatibility JavaVersion.VERSION_1_7
 targetCompatibility JavaVersion.VERSION_1_7
 }
}

最后同步一下即可

(13)Glide使用問題:使用Glide加載圓角圖片,第一次顯示占位圖

  • 問題描述
    最近在項目中使用Glide加載圓形圖片,并且設置placehloder和error兩個占位圖,運行發現,第一次加載圖片只顯示占位圖,需要第二次進入的時候才會正常顯示。
    如果你剛好使用了這個圓形Imageview庫或者其他的一些自定義的圓形Imageview,而你又剛好設置了占位的話,那么,你就會遇到第一個問題。如何解決呢?

  • 方案一
    不設置占位圖

  • 方案二
    使用Glide的Transformation API自定義圓形Bitmap的轉換

   /**
     * Glide圓形圖片處理
     */
    static class CircleTransform extends BitmapTransformation {
        public CircleTransform(Context context) {
            super(context);
        }

        @Override
        protected Bitmap transform(BitmapPool pool, Bitmap toTransform, int outWidth, int outHeight) {
            return circleCrop(pool, toTransform);
        }

        private static Bitmap circleCrop(BitmapPool pool, Bitmap source) {
            if (source == null) return null;

            int size = Math.min(source.getWidth(), source.getHeight());
            int x = (source.getWidth() - size) / 2;
            int y = (source.getHeight() - size) / 2;

            Bitmap squared = Bitmap.createBitmap(source, x, y, size, size);

            Bitmap result = pool.get(size, size, Bitmap.Config.RGB_565);
            if (result == null) {
                result = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
            }

            Canvas canvas = new Canvas(result);
            Paint paint = new Paint();
            paint.setShader(new BitmapShader(squared, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
            paint.setAntiAlias(true);
            float r = size / 2f;
            canvas.drawCircle(r, r, r, paint);
            return result;
        }

        @Override
        public String getId() {
            return getClass().getName();
        }
    }

使用方法:

 Glide.with(context).load(imageUrl).placeholder(placeholder).error(errorImage).transform(new CircleTransform(context)).into(imageView);

方案三
重寫Glide的圖片加載監聽方法,具體如下:

Glide.with(mContext) 
.load(url) 
.placeholder(R.drawable.loading_drawable) 
.into(new SimpleTarget<Bitmap>(width, height) {
 @Override public void onResourceReady(Bitmap bitmap, GlideAnimation anim) { 
// setImageBitmap(bitmap) on CircleImageView  
} 
});

注意事項:
該方法在listview上復用有問題的bug,如果在listview中加載CircleImageView,請不要使用該方法。

方案四:不使用Glide的默認動畫:


Glide.with(mContext)
    .load(url) 
    .dontAnimate()
    .placeholder(R.drawable.loading_drawable)
    .into(circleImageview);

(14)json數據解析問題:json串頭部出現字符:"\ufeff" 解決方法
異常信息

org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject

解析服務器返回 的json格式數據時,我們可能會發現,數據格式上是沒有問題的,但是仔細對比會發現,在json串頭部發現字符:"\ufeff"

客戶端解決方案:

/** 
* 異常信息:org.json.JSONException: Value  of type java.lang.String cannot be converted to JSONObject 
* json串頭部出現字符:"\ufeff" 解決方法
* @param data 
* @return 
*/
public static final String removeBOM(String data) {    
if (TextUtils.isEmpty(data)) {        
         return data;    
}    
if (data.startsWith("\ufeff")) {        
        return data.substring(1);    
       } 
else {        
        return data;    
        }
}

服務器端解決方案:
將輸出此json的php源碼重新用editplus之類用utf-8無BOM的編碼保存。不要用windows系統自帶的記事本編輯php源碼,這個BOM就是記事本這些windows自帶的編輯器引入的。

(15)Android studio編譯問題:not found ndk()
問題

Error:(15, 0) Gradle DSL method not found: 'ndk()' method-not-found-ndk

解決方案
出現該問題,可能是由于ndk配置在build.gradle配置文件中位置弄錯導致的

apply plugin: 'com.android.application'
android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "com.guitarv.www.ndktest"
        minSdkVersion 17
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk {
            moduleName = "HelloJNI"
        }
        sourceSets.main {
            jni.srcDirs = []
            jniLibs.srcDir "src/main/libs"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

(16)Android studio導入其他的項目:UnsupportedMethodException
問題

UnsupportedMethodException
        Unsupported method: AndroidProject.getPluginGeneration().
        The version of Gradle you connect to does not support that method.
        To resolve the problem you can change/upgrade the target version of Gradle you connect to.
        Alternatively, you can ignore this exception and read other information from the model.
錯誤截圖

解決方案

將根目錄中的build.gradle文件中的gradle版本號,出現錯誤之前,我的是1.3.0,修改成2.2.0之后重新編譯一下就可以運行了。

dependencies {    
classpath 'com.android.tools.build:gradle:1.3.0'   
}

將這個版本號改成你其他項目能夠運行成功的版本號即可

(17)Android studio更新到2.1.1之后使用CollapsingToolbarLayout出現Error inflating class CollapsingToolbarLayout
之前在項目中使用了CollapsingToolbarLayout,效果還是可以的,但是Android stuido更新到2.1.1版本之后出現Error inflating class CollapsingToolbarLayout 異常崩潰
異常信息如下所示:

com.test.android/com.test.android.ui.activity.RandomActivity}: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                      at android.os.Looper.loop(Looper.java:135)
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                      at java.lang.reflect.Method.invoke(Method.java:372)
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                   Caused by: android.view.InflateException: Binary XML file line #22: Error inflating class android.support.design.widget.CollapsingToolbarLayout
                                                                      at android.view.LayoutInflater.createView(LayoutInflater.java:633)
                                                                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
                                                                      at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276)
                                                                      at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136)
                                                                      at com.test.android.ui.activity.RefreshableActivity.onCreate(RefreshableActivity.java:31)
                                                                      at android.app.Activity.performCreate(Activity.java:5990)
                                                                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                      at android.os.Looper.loop(Looper.java:135) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at java.lang.reflect.Method.invoke(Method.java:372) 
                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 
                                                             
                                                                   Caused by: java.lang.NoSuchMethodError: No static method setLayoutDirection(Landroid/graphics/drawable/Drawable;I)V in class Landroid/support/v4/graphics/drawable/DrawableCompat; or its super classes (declaration of 'android.support.v4.graphics.drawable.DrawableCompat' appears in /data/app/com.test.android-1/base.apk)
                                                                      at android.support.design.widget.CollapsingToolbarLayout.setStatusBarScrim(CollapsingToolbarLayout.java:663)
                                                                      at android.support.design.widget.CollapsingToolbarLayout.<init>(CollapsingToolbarLayout.java:197)
                                                                      at android.support.design.widget.CollapsingToolbarLayout.<init>(CollapsingToolbarLayout.java:132)
                                                                      at java.lang.reflect.Constructor.newInstance(Native Method) 
                                                                      at java.lang.reflect.Constructor.newInstance(Constructor.java:288) 
                                                                      at android.view.LayoutInflater.createView(LayoutInflater.java:607) 
                                                                      at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743) 
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
                                                                      at android.view.LayoutInflater.rInflate(LayoutInflater.java:809) 
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
                                                                      at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
                                                                      at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:276) 
                                                                      at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:136) 
                                                                      at com.test.android.ui.activity.RefreshableActivity.onCreate(RefreshableActivity.java:31) 
                                                                      at android.app.Activity.performCreate(Activity.java:5990) 
                                                                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106) 
                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278) 
                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                      at android.os.Looper.loop(Looper.java:135) 
                                                                      at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                      at java.lang.reflect.Method.invoke(Native Method) 
                                                                      at java.lang.reflect.Method.invoke(Method.java:372)

解決方案
在項目的build.gradle文件中添加下面一行,同步一下即可

compile ('com.android.support:support-v4:23.4.0'){
    force = true;
}

StackOverFlow解決方案

(18)Android studio gradle編譯異常

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

很顯然是class版本不支持。經查詢,Android Studio2.2必須使用JDK8及以上版本,而且是強制的。
所以呢,趕緊下了個JDK8最新版的。安裝完畢,把JAVA_HOME指向了JDK8,實測JDK7和8是可以共存的。
那么,重啟Android Studio后問題解決,Build Successful !

(19)電腦突然斷電,Android studio 工程代碼全部報錯,找不到android sdk 的依賴包,clean、重啟都沒有用
前幾天公司搬家,正準備同步代碼,突然斷電、等把電腦搬到新辦公樓,打開AS發現所有的項目代碼報錯,找不到android 依賴包,clean、重啟都沒有用,

(20)recycleview嵌套列表項顯示不全問題
解決方案:
第一個RecyclerView的Adapter(即父RecyclerView):

@Override  
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
               View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_item,null); 解決條目顯示不全  
               MyHolder holder = new MyHolder(view);  
                   return holder;  
     }  

第二個RecyclerView的Adapter(即子RecyclerView):

@Override  
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {  
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.check_item, parent,false);//解決寬度不能鋪滿  
   MyHolder holder = new MyHolder(view);  
      return holder;  
   }  

(21)Android手機真機調試,日志不打印的解決方案:

1、在撥號界面輸入:*#*#2846579#*#* 進入測試菜單界面。 
2、Project Menu–后臺設置–LOG設置
3、LOG開關–LOG打開 LOG級別設置–VERBOSE 
4、Dump&Log– 全部選中
5、重啟手機

(22)java.lang.IndexOutOfBoundsException Inconsistency detected. Invalid item position 2(offset:2).state:4
解決方案:Recyclerview在下拉刷新時,如果在數據沒更新到之前將list clear 之后,迅速滑動會造成crash,所以一般在下拉刷新之前,等數據刷新回來再把之前的數據進行清除。

(23)**使用友盟分享——微信、朋友圈分享出現java.lang.NoClassDefFoundError: org.apache.http.entity.mime.MultipartEntity
**
解決方案: 造成這樣的原因是因為缺少httpmime_jar,添加是httpmime_jar包之后即可正常分享

(24)Fragment中調用getActivity()出現空指針異常
解決方案:

  對于上面的問題,可以考慮下面這兩種解決辦法:
  1、不保存fragment的狀態:在MyActivity中重寫onSaveInstanceState方法,將super.onSaveInstanceState(outState);注釋掉,讓其不再保存Fragment的狀態,達到fragment隨MyActivity一起銷毀的目的。
  2、重建時清除已經保存的fragment的狀態:在恢復Fragment之前把Bundle里面的fragment狀態數據給清除。方法如下:
       if(savedInstanceState!= null)
       {
           String FRAGMENTS_TAG = "android:support:fragments";
           savedInstanceState.remove(FRAGMENTS_TAG);
       }

(25)RecyclerView嵌套使用切換頁面出現自動滾動問題
原因:
造成這樣的原因是由于子RecyclerView搶占焦點導致的,如果你去查看RecyclerView的源碼會發現,它會在構造方法中調用setFocusableInTouchMode(true),所以,設為false可以解決這個問題。
解決方案
在子RecyclerView中調用如下方法

           //設置焦點不需要
           secondRvList.setFocusableInTouchMode(false);
           secondRvList.requestFocus();

(26)Android 7.0設備拍照閃退問題
原因:
Android 7.0 做了一些系統權限更改,為了提高私有文件的安全性,面向 Android 7.0 或更高版本的應用私有目錄被限制訪問,此設置可防止私有文件的元數據泄漏,如它們的大小或存在性。而此權限更改有多重副作用,其中之一就是當傳遞軟件包網域外的 file:// URI 可能給接收器留下無法訪問的路徑。因此,嘗試傳遞 file:// URI 會觸發 FileUriExposedException。分享私有文件內容的推薦方法是使用 FileProvider。在應用間共享文件對于面向 Android 7.0 的應用,Android 框架執行的 StrictMode API 政策禁止在您的應用外部公開 file:// URI。如果一項包含文件 URI 的 intent 離開您的應用,則應用出現故障,并出現 FileUriExposedException 異常。要在應用間共享文件,應發送一項 content:// URI,并授予 URI 臨時訪問權限。進行此授權的最簡單方式是使用 FileProvider 類。點擊查看Android官方說明
解決方案
1.在清單文件添加如下代碼

    <provider
           android:name="android.support.v4.content.FileProvider"
           android:authorities="你的應用包名.fileProvider"
           android:exported="false"
           android:grantUriPermissions="true">

           <meta-data
               android:name="android.support.FILE_PROVIDER_PATHS"
               android:resource="@xml/provider_paths"/>

       </provider>
android:authorities="com.alex.demo.FileProvider" 自定義的權限  
android:exported="false" 是否設置為獨立進程  
android:grantUriPermissions="true" 是否擁有共享文件的臨時權限  
android:resource="@xml/external_storage_root" 共享文件的文件根目錄,名字可以自定義  

2.在xml文件夾目錄下新建provider_paths文件,名字自定義,添加如下代碼

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <paths>
       <external-path
           name="camera_photos"
           path="" />
   </paths>
</resources>

3.調用系統相機處代碼處理

  //調用系統相機拍照
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, parUri(tempFile));
 startActivityForResult(cameraIntent, REQUEST_CAMERA);
}

  /**
    * 生成uri
    *
    * @param cameraFile
    * @return
    */
   private Uri parUri(File cameraFile) {
       Uri imageUri;
       String authority = getContext().getPackageName()+ ".provider";
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
           //通過FileProvider創建一個content類型的Uri
           imageUri = FileProvider.getUriForFile(getContext(), authority, cameraFile);
       } else {
           imageUri = Uri.fromFile(cameraFile);
       }
       return imageUri;
   }

(27)使用Glide加載列表項,刷新之后圖片大小出現縮放問題

原因:導致這樣的問題是因為ImageView的默認資源大小和下載資源大小不一樣。

解決方案:

(1)加載與Imageview 設置的寬高一致的圖片,有的圖片地址后面可以拼接對應的分辨率大小,然后根據傳的分辨率大小來下載圖片;

(2) 代碼里面再設置一下ImageView的大小,然后再加載圖片

/**
 *
 *此處的MyBitmapImageViewTarget 為自定義的BitmapImageViewTarget,在里面獲取imagview的寬高
 **/
Glide.with(context)
.load(url)
.asBitmap()
.centerCrop()
.placeholder(loadingPic)
.error(errorPic)
.into(new MyBitmapImageViewTarget(imageView));

(3)禁止Glide的默認加載動畫,也可以解決這個問題

Glide.with(context)..load(url).placeholder(R.drawable.icon_stub_dynamic).dontAnimate().into(imageView);

(28)解決android 6.0(api 23) SDK,不再提供org.apache.http.(只保留幾個類)

android {
   useLibrary 'org.apache.http.legacy'
}

(29)'gradlew' 不是內部或外部命令,也不是可運行的程序或批處理文件。
最近一個項目中需要使用到gradlew命令,Gradle相關環境變量也都配置好了,但就是在這個項目目錄下運行gradlew命令不成功,相同的電腦另外一個項目目錄下卻可以運行成功,于是對比了一下兩個項目的文件結構,發現缺少兩個文件,如下所示,將這兩個文件拷貝過來重新運行命令即可成功。

image.png

(30)Only fullscreen opaque activities can request orientation

給activity啟動頁設置orientation后出現了錯誤主要是Android8.0上有異常,沒有兼容。

1.找到你設置透明的Activity,然后在他的theme中將android:windowIsTranslucent改為false
<item name="android:windowIsTranslucent">false</item>
2.再加入<item name="android:windowDisablePreview">true</item>
3.去掉activity中的orientation屬性

** (31)Android API>=28 http 圖片無法加載
原因 : 這是由于http協議安全問題,在api上訪問http協議被認為時不安全

** 解決辦法:**

  1. 在res目錄下創建xml文件夾,在xml下創建network_security_config.xml文件
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
   <base-config cleartextTrafficPermitted="true" />
</network-security-config>
  1. 在AndroidManifest文件中配置
android:networkSecurityConfig=”@xml/network_security_config” 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,786評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,656評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,697評論 0 379
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,098評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,855評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,254評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,322評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,473評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,014評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,833評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,016評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,568評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,273評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,680評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,946評論 1 288
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,730評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,006評論 2 374

推薦閱讀更多精彩內容