小编anb*_*ber的帖子

gradle - 库在依赖项中重复

我有一个带gradle的Android项目.问题是:在project视图中我看到了几个版本的support-v4库,例如support-v4-21.0.3support-v4-22.2.0.

但在build.gradle我根本没有support-v4.

但我有~10个其他依赖项build.gradle.例如 appcompat-v7:22.2.0.我可以表明,appcompat-v7:22.2.0实际上还要考虑support-v4-22.2.0在Maven的依赖关系,并含蓄地将其拉.但我没有任何想法support-v4-21.0.3.

据我所知,所有这些库将包装在我的APK中并增加APK的重量.

所以我有下一个问题:

  1. 如何避免库重复?
  2. 如何在Android Studio中查看maven依赖项?
  3. 如何检测哪个库需要这个库?例如,support-v4-21.0.3我的项目中哪个库需要?

android gradle maven android-studio

47
推荐指数
1
解决办法
4万
查看次数

为什么Nexus 6密度为560 dpi?

如何为Nexus 6准备资源?如果我将图像放到xxxhdpi,它们将缩小并降低质量.我把图像放到xxhdpi它们会扩大并失去质量.如果实际密度493ppi更接近xxhdpi~480dpi,为什么开发人员决定设置值为560dpi?

Nexus 6拥有令人印象深刻的5.96英寸四核高清屏幕,分辨率为2560 x 1440(493 ppi).这转换为~730 x 410 dp(密度无关像素).

Nexus 6的量化密度为560 dpi,介于xxhdpi和xxxhdpi主密度桶之间.

对于Nexus 6,该平台将缩减xxxhdpi资产,但如果这些资产不可用,那么它将扩大xxhdpi资产.

xxhdpi ~480dpi
xxxhdpi ~640dpi
Run Code Online (Sandbox Code Playgroud)

android dpi screen-density

32
推荐指数
2
解决办法
2万
查看次数

cursor.setNotificationUri()用于什么?

我在本教程中研究了如何使用ContentProviders和加载器

我是怎么看的:我们有一个ActivityListView,SimpleCursorAdapterCursorLoader.我们也实施ContentProvider.

Activity我们可以调用getContentResolver().insert(URI, contentValues);通过点击一个按钮.

在我们的实现中ContentProvider,在insert()方法结束时,我们调用getContentResolver().notifyChange(URI, null);并且我们CursorLoader将收到消息,它应该重新加载数据并更新UI.此外,如果我们FLAG_REGISTER_CONTENT_OBSERVERSimpleCursorAdapter其中使用它也将接收消息并且onContentChanged()将调用其方法.

因此,如果我们插入,更新或删除数据,我们的ListView将会更新.

Activity.startManagingCursor(cursor);已弃用,cursor.requery()已弃用,因此我没有看到任何练习意义 cursor.setNotificationUri().

我查看了setNotificationUri()方法的源代码,发现它调用mContentResolver.registerContentObserver(mNotifyUri, true, mSelfObserver)了方法.也是CursorLoader一样的.最后,游标将接收消息,并在Cursor内部调用以下方法:

protected void onChange(boolean selfChange) {
    synchronized (mSelfObserverLock) {
        mContentObservable.dispatchChange(selfChange, null);
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

但我无法理解这一点.

所以我的问题是:我们为什么要叫cursor.setNotificationUri()query()我们的方法ContentProvider实现?

database android cursor android-contentresolver android-contentprovider

23
推荐指数
2
解决办法
9403
查看次数

将协程更新到1.2.0后构建失败:META-INF / atomicfu.kotlin_module

更新至org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.0android构建失败后,出现以下问题: More than one file was found with OS independent path 'META-INF/atomicfu.kotlin_module'

有什么解决方法可以使其正常工作?

android kotlin kotlin-coroutines

14
推荐指数
1
解决办法
1127
查看次数

Android Studio 3.4依赖项建议-使其不显示Alpha / Beta版本

在Android Studio 3.4中,suggestions在“项目结构”中添加了新窗口,建议将gradle依赖项更新为最新版本。是否可以仅显示最终版本而没有alpha / beta版本?

android android-studio

13
推荐指数
1
解决办法
222
查看次数

Android Facebook授权 - 安装官方Facebook应用时无法登录

我需要登录Facebook并获得相同的字段,如电子邮件等.我使用Facebook SDK,然后在developers.facebook中设置我的Android密钥Hash并设置"Configured for Android SSO".在模拟器和一些设备中,应用程序工作正常.

但是如果设备上安装了正式的Facebook应用程序,我的应用程序就无法运行:我按下登录按钮,但是我没有看到带有网络视图的对话框,我的密码和登录被要求.看起来Stack Overflow问题中的问题使用Android SDK的facebook.authorize不会调用onActivityResult或Stack Overflow问题Android Facebook API单点登录?,但我无法理解如何解决它.

我的代码

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    this.facebookConnector.getFacebook().authorizeCallback(requestCode, resultCode, data);
}

public void getAccessToken() {
    SessionEvents.AuthListener listener = new SessionEvents.AuthListener() {
        @Override
        public void onAuthSucceed() {
            setupAccessToken(facebookConnector.getFacebook().getAccessToken());
        }

        @Override
        public void onAuthFail(String error) {
            Toast.makeText(getApplicationContext(), getString(R.string.error_login), Toast.LENGTH_SHORT).show();
        }
    };

    SessionEvents.addAuthListener(listener);
    facebookConnector.login();
}
Run Code Online (Sandbox Code Playgroud)

facebookConnector代码

public class FacebookConnector {
    public void login() {
        if (!facebook.isSessionValid()) {
            facebook.authorize(this.activity, this.permissions, new LoginDialogListener());
        }
    }

    private …
Run Code Online (Sandbox Code Playgroud)

authentication android facebook login

10
推荐指数
2
解决办法
1万
查看次数

Android风味 - 在R文件中找不到符号变量

我有2种口味 - paidapp和freeapp.唯一不同的是,paidapp还有1个按钮MainActivity,比方说"paidbutton".paidapp有自己的布局,按钮android:id="@+id/paidbutton"和freeapp的布局没有这个按钮.

在代码我用这个:

if (BuildConfig.FLAVOR.equals("paidapp")) {
            View paidbutton = findViewById(R.id.paidbutton);
            paidbutton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    //...
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

但我有一个错误cannot find symbol variablefindViewById(R.id.paidbutton);

如何解决这个问题而不在两种风格中克隆MainActivity.java?

EDIT1 - 添加更多代码示例:

摇篮:

productFlavors {
    paidapp {
    }
    freeapp {
    }
}
Run Code Online (Sandbox Code Playgroud)

/app/src/main/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/goNext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go next" />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

/app/src/paidapp/res/layout/activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/goNext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Go …
Run Code Online (Sandbox Code Playgroud)

android r.java-file android-productflavors

8
推荐指数
1
解决办法
9915
查看次数

Android应用程序中的内存指标

我写了Android应用程序,它的内存不足异常有一些奇怪的问题,它是随机出现的。是的,我知道OOM异常的问题通常是由于图像引起的,我尽力避免了此问题。我认为可以找到占用内存的地方的唯一方法是将包含有关内存信息的日志放到任何地方。但是我真的很困惑我需要哪些值。

我使用了下一个值:

  • Runtime.getRuntime()。maxMemory()
  • Runtime.getRuntime()。freeMemory()
  • Runtime.getRuntime()。totalMemory()
  • Debug.getNativeHeapAllocatedSize()
  • Debug.getNativeHeapFreeSize()
  • Debug.getNativeHeapSize()

在OOM异常之前,我有下一个值:

  • 最大内存:57344K
  • freeMemory:9581K
  • 总内存:22407K
  • NativeHeapAllocatedSize:34853K
  • NativeHeapFreeSize:302K
  • 本机堆大小:40060K
  • lowMemory错误

在这个问题上的Android位图限制-防止java.lang.OutOfMemory我看到用compeering((reqsize + Debug.getNativeHeapAllocatedSize()+ heapPad)> =调用Runtime.getRuntime()maxMemory()。)蚂蚁在这个博客的一些奇怪的信息:

Debug.getNativeHeapFreeSize(); 可用大小是由于碎片或资源分配而未使用的堆中的内存量。

另外我不明白如果(totalMemory:22407K)比(maxMemory:57344K)小得多,可能是OOM异常。

请帮助我了解如何使用此值。

android memory-management out-of-memory

5
推荐指数
0
解决办法
313
查看次数

结合 BuildType 和 Flavor 资源

我有 2 个版本的应用程序:付费应用程序和免费应用程序。我使用 gradle 和 Android Studio。我有下一个文件夹结构: src文件夹,里面有 3 个文件夹:main, paidapp, freeapp- 其中paidapp 和 freeapp 是口味。我的配置:

defaultConfig {
    applicationId "com.company"
}

buildTypes {
    debug {
        applicationIdSuffix '.dev'
    }
}

productFlavors {
    freeapp {
    }
    paidapp {
        applicationId 'com.company.paidapp'
    }
}
Run Code Online (Sandbox Code Playgroud)

我想要什么:我的手机上有 4 个应用程序:

package com.company.dev, name "dev freeapp"
package com.company.paidapp.dev, name "dev paidapp"
package com.company, name "freeapp"
package com.company.paidapp, name "paidapp"
Run Code Online (Sandbox Code Playgroud)

包没问题,gradle自动管理它,但是如何为应用程序创建不同的名称?

应用程序名称strings.xml 位于src/paidapp/res/values/strings.xml

<string name="appName">dev paidapp</string>
Run Code Online (Sandbox Code Playgroud)

src/freeapp/res/values/strings.xml

<string …
Run Code Online (Sandbox Code Playgroud)

android gradle

5
推荐指数
1
解决办法
2282
查看次数

Android基础风格没有重复的类错误

我有我的应用程序的几个版本:普通版,说mainapp和几个建立每个客户的具体,比如说custom1,custom2,custom3.我希望所有customX口味都有基调.

我试图这样做:

创建项目结构:

app\src\main
app\src\mainapp
app\src\commonflavor
app\src\custom3
Run Code Online (Sandbox Code Playgroud)

并配置:

productFlavors {
    mainapp {
    }
    custom1 {
    }
    custom2 {
    }
    custom3 {
    }
}

sourceSets {
    custom1 {
        java.srcDirs = ['src/commonflavor/java']
    }
    custom2 {
        java.srcDirs = ['src/commonflavor/java']
    }
    custom3 {
        java.srcDirs = ['src/commonflavor/java', 'src/custom3/java']
    }
}
Run Code Online (Sandbox Code Playgroud)

commonflavor我为所有customX风格添加常见的java类时,请说MainActivity.javaSecondActivity.java.但是custom3我需要分开SecondActivity.java.

在这种情况下,我有一个错误error: duplicate class: SecondActivity来自src/commonflavor/javasrc/custom3/java.

现在我已经使用class dupllication解决了这个问题:

sourceSets {
    custom1 { …
Run Code Online (Sandbox Code Playgroud)

android gradle android-productflavors

5
推荐指数
1
解决办法
2162
查看次数