标签: android-6.0-marshmallow

如何正确触发ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS意图?

如文档中所述:

"An app holding the REQUEST_IGNORE_BATTERY_OPTIMIZATIONS permission can trigger a system dialog to let the user add the app to the whitelist directly, without going to settings. The app fires a ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent to trigger the dialog."

Can someone tell me the proper way to fire this intent?

optimization android android-intent android-6.0-marshmallow android-doze

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

Android自定义权限 - Marshmallow

背景

从历史上看,Android自定义权限一直是一个混乱,并且依赖安装顺序,这已知会暴露漏洞.

在API 21之前,有一个令人不安的解决方法,即在您的Manifest中声明另一个应用程序的自定义权限,授予权限......但是,自API 21以来,只有一个应用程序可以声明自定义权限并安装另一个应用程序声明同样的许可,将被阻止.

替代方案是重新安装需要许可的应用程序,因此系统会检测到它们,但这不是一个好的用户体验.或者在运行时检查调用应用程序的权限,但这并非没有理论上的缺陷.

问题

从Android Marshmallow(6.0 - API 23)开始,应用程序需要请求用户的许可,才能使用自己的自定义权限.未自动授予声明的自定义权限.

这似乎很奇怪,因为现在只有一个应用程序可以声明它.

要复制

在Manifest中声明自定义权限和BroadcastReceiver.

<permission
    android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"
    android:description="@string/control_description"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/control_label"
    android:protectionLevel="normal or dangerous"/>

<uses-permission
    android:name="com.example.app.permission.CONTROL_EXAMPLE_APP"/>

// etc

<receiver
    android:name="com.example.app.MyBroadcastReceiver"
    android:permission="com.example.app.permission.CONTROL_EXAMPLE_APP">
    <intent-filter android:priority="999">
        <action android:name="com.example.app.REQUEST_RECEIVER"/>
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

从第三方应用程序,声明它使用Manifest中的自定义权限(并通过对话框或设置接受它)并调用:

    final Intent intent = new Intent("com.example.app.REQUEST_RECEIVER");

    context.sendOrderedBroadcast(intent, "com.example.app.permission.CONTROL_EXAMPLE_APP", new BroadcastReceiver() {
        @Override
        public void onReceive(final Context context, final Intent intent) {

        // getResultCode();

        }
    }, null, Activity.RESULT_CANCELED, null, null); …
Run Code Online (Sandbox Code Playgroud)

permissions android android-6.0-marshmallow

31
推荐指数
1
解决办法
2595
查看次数

Android 6:不能再共享文件了?

我正在共享一个图像,这段代码适用于Android 6之前的设备:

Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("image/*");
Uri uri = Uri.fromFile(new File(mFilename));
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
mContext.startActivity(Intent.createChooser(shareIntent, mChooserTitle));
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用Android 6共享时,我收到toast错误" 无法附加空文件 ".

我确认该文件存在且不是零长度.

有人有解决方案吗?

android share android-intent android-6.0-marshmallow

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

打开应用权限设置

关于Android M的细化权限

如果用户拒绝两次许可请求,

或者用户标记"从不再问".

如何直接打开/链接到应用权限设置?

permissions android android-6.0-marshmallow

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

与Android 6.0的Apache HTTP连接(Marshmallow)

有没有办法直接在Gradle中包含Apache库以使其与Android 6.0一起使用?

我试图包括这样的库:

compile 'org.apache.httpcomponents:httpcore:4.4.1'
compile 'org.apache.httpcomponents:httpclient:4.5'
Run Code Online (Sandbox Code Playgroud)

并且Android Studio无法找到以下导入:

import org.apache.http.auth.AuthenticationException;
import org.apache.http.auth.Credentials;
import org.apache.http.auth.MalformedChallengeException;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.impl.auth.DigestScheme;
Run Code Online (Sandbox Code Playgroud)

android apache-httpclient-4.x android-gradle-plugin android-6.0-marshmallow

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

如何处理在Android M中删除广播接收器的权限?

我有一些遗留代码,我正在为Marshmallow提供安全许可.

使用PHONE_STATE权限进行广播,如下所示:

<receiver android:name="redacted.TheBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.PHONE_STATE"></action>
        <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
    </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

如果PHONE_STATE权限被授予,但稍后用户被拒绝,那么当有电话呼叫时,存在与权限相关的崩溃.但崩溃发生广播接收器的onReceive()被调用之前(崩溃在android.app.ActivityThread.handleReceiver中).这意味着广播接收器甚至没有机会检查是否授予许可并处理该情况.

所以我的问题是,如果有这样的广播接收器,代码如何处理用户已禁用权限的情况,因为AFAIK没有API来监视权限发生时的变化,因此代码无法知道该权限已被撤销,因此它无法取消注册其广播接收器.

android android-permissions android-6.0-marshmallow

29
推荐指数
1
解决办法
3716
查看次数

如何在Android中自定义权限对话框?

假设我在运行时请求权限,如下所示:

ActivityCompat.requestPermissions(thisActivity,
            new String[]{Manifest.permission.READ_CONTACTS},
            MY_PERMISSIONS_REQUEST_READ_CONTACTS);
Run Code Online (Sandbox Code Playgroud)

Android系统会创建一个弹出对话框来请求权限.如何为该对话框定义自定义布局?

android android-permissions android-6.0-marshmallow

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

以编程方式安装Android M Light and Dark状态栏 - 如何让它再次变黑?

在Android M中,我们可以使状态栏图标变暗.为此,我们可以在主题的xml中指定属性:

<item name="android:windowLightStatusBar">true</item>
Run Code Online (Sandbox Code Playgroud)

或者我们使用以下代码在运行时设置它:

View someView = findViewById(R.id.some_view);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    someView.setSystemUiVisibility(someView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
}
Run Code Online (Sandbox Code Playgroud)

它实际上工作正常.但问题是如何在运行时将状态栏模式正确设置为黑暗?

我已经尝试过那些变种:

// Makes status bar mode dark, but also hides it along with all navigation views. 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() | ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// Does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() & ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);

// Also does nothing 
someView.setSystemUiVisibility(someView.getSystemUiVisibility() ^ View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
Run Code Online (Sandbox Code Playgroud)

那么如何才能以正确的方式完成?

user-interface android android-statusbar android-6.0-marshmallow

28
推荐指数
7
解决办法
3万
查看次数

Android getAllNetworkInfo()已弃用.有什么选择?

我想使用连接管理器,它提供方法getAllNetworkInfo()来检查Android中的网络可用性.此方法在API级别23中已弃用.而Developer doc建议使用getAllNetworks().我试过但是没有得到我从旧代码中获得的确切功能.请有人指导我如何使用getAllNetworks()方法.以下是我正在使用的代码:

 public boolean isConnectingToInternet(){
    ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
      if (connectivity != null) 
      {
          @SuppressWarnings("deprecation")
        NetworkInfo[] info = connectivity.getAllNetworkInfo();
          //use getAllNetworks() instead
          if (info != null) 
              for (int i = 0; i < info.length; i++) 
                  if (info[i].getState() == NetworkInfo.State.CONNECTED)
                  {
                      return true;
                  }
      }
      return false;
}
Run Code Online (Sandbox Code Playgroud)

networking android android-6.0-marshmallow

27
推荐指数
3
解决办法
3万
查看次数

Android 6.0对话框文本不会出现

我将手机更新到Android 6.0,我有两个对话框问题:

1)显示标题,但消息不用于警告对话框(已解决):

        new AlertDialog.Builder(context).setTitle("Title").setMessage("Message");
Run Code Online (Sandbox Code Playgroud)

2)也没有显示自定义对话框片段的标题(未解决):

        getDialog().setTitle("Title");
Run Code Online (Sandbox Code Playgroud)

在棒棒糖或旧版本中没有这样的问题,只有在将手机更新为棉花糖后才出现问题.

如何解决问题?

android android-alertdialog android-dialog android-dialogfragment android-6.0-marshmallow

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