【问题标题】:My android app showing white screen after changing targetSDK version更改 targetSDK 版本后,我的 android 应用程序显示白屏
【发布时间】:2017-04-05 04:25:02
【问题描述】:

我正在使用 Android Build Target API 24 (OS 7) 编写 android 应用程序。对于 API 23 及以上版本,我必须提示 ACCESS_COARSE_LOCATION 的许可。所以我改变了我的 Android.Manifest 如下所示。

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="24" />

之后我的应用程序只显示白屏,没有任何反应。我正在使用 Eclipse IDE。但是当我将 targetSdkVersion 更改为 22 时,应用程序在其他进程中运行良好,但没有显示 ACCESS_COARSE_LOCATION 的权限提示,并且定位进程无法使用,并且 LogCat 中显示以下错误。

权限拒绝:需要 ACCESS_COARSE_LOCATION 或 ACCESS_FINE_LOCATION 权限才能获取扫描结果

我该怎么做?请帮我。是否需要将 targetSdkVersion 更改为 24?

更新

这是我的 Manifest.xml 完整代码。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.company_name.apps.my_app_name"
android:versionCode="16"
android:versionName="2.1.1" android:installLocation="internalOnly">

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="24" />


<uses-permission android:name="com.android.vending.BILLING" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"/>

<uses-permission android:name="android.permission.CAMERA"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<!-- end GCM permission -->


<!-- map -->

<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />

<!-- External storage for caching. -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

这是我的访问权限代码。

 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Log.d("PermissionGAndroid6", "MarshMallow OS6");
        if (this.checkSelfPermission(android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            Log.d("PermissionG1","Permission Granted Prompt");
            requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);
        }
    }
    else {
        setContentView(R.layout.activity_main);

        Exchanger.start(this, APPLICATION_CODE, ORIENTATION, TEST_MODE);
          // default first fragment is MainFragment
          if (findViewById(R.id.container) != null) {
              mMainFragment = new MainFragment();
              FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
              ft.add(R.id.container, mMainFragment, "MainFragment").commit();
          }
          LogTracker.getTracker().startUsingApp();
    }

}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[],
                                       int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_COARSE_LOCATION: {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.d("PermissionG", "coarse location permission granted");
                setContentView(R.layout.activity_main);

                Exchanger.start(this, APPLICATION_CODE, ORIENTATION, TEST_MODE);
                  // default first fragment is MainFragment
                  if (findViewById(R.id.container) != null) {
                      mMainFragment = new MainFragment();
                      FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
                      ft.add(R.id.container, mMainFragment, "MainFragment").commit();
                  }
                  LogTracker.getTracker().startUsingApp();
            } else {
                requestPermissions(new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, PERMISSION_REQUEST_COARSE_LOCATION);

            }
            return;
        }
    }
}

【问题讨论】:

  • 在清单中添加权限并包含运行时权限
  • 你能展示你的完整清单吗?以及运行时权限代码?
  • 我更新了我的问题。请检查并帮助我。现在的问题是在我将 android:targetSdkVersion 更改为“23”或“24”之后,我的应用程序只显示白屏。在那个阶段显示权限提示。在我将 android:targetSdkVersion 更改为“23”以下(例如:“22”)之后,应用程序已打开,但位置访问权限提示未显示,并且 LogCat 中显示权限拒绝。

标签: android eclipse


【解决方案1】:

试试这个,

    private Context mContext=YourActivity.this;

    private static final int REQUEST = 112;


    if (Build.VERSION.SDK_INT >= 23) {
        String[] PERMISSIONS = {android.Manifest.permission.ACCESS_COARSE_LOCATION,android.permission.ACCESS_FINE_LOCATION};
        if (!hasPermissions(mContext, PERMISSIONS)) {
            ActivityCompat.requestPermissions((Activity) mContext, PERMISSIONS, REQUEST );
        } else {
            //do here
        }
    } else {
         //do here
    }

获取权限结果

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case REQUEST: {
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                        //do here
                } else {
                    Toast.makeText(mContext, "The app was not allowed to access your location.", Toast.LENGTH_LONG).show();
                }
            }
        }
    }

检查棉花糖的权限

    private static boolean hasPermissions(Context context, String... permissions) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
            for (String permission : permissions) {
                if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                    return false;
                }
            }
        }
        return true;
    }

清单

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

【讨论】:

    【解决方案2】:

    API 22 以上,根据新的 android 指南,您需要为每个敏感用户数据添加权限,请参阅 https://developer.android.com/training/permissions/requesting.html 以了解权限模型。 https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html 是在 API 22 以上询问 Location Permission 的示例。

    【讨论】:

      【解决方案3】:

      应用只显示白屏,没有任何反应。

      请先设置内容视图。在onCreate() 完成后,您可以检查并请求权限。

      super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);

      【讨论】:

      • 你说的我改了。但仍然出现白屏:(
      • 很抱歉听到这个消息。我的建议是:尝试ActivityCompat.requestPermissions 而不是requestPermissions。并确保您的 UI 在 API24 中运行良好。
      • 我改为 ActivityCompat.requestPermissions 。那时 ActivityCompat 无法解析。
      • 使用 Android Studio 和 gradle,使用 compile 'com.android.support:appcompat-v7:25.3.0' 。所以我建议你尝试在 Eclipse 中导入 v4 或 v7 appcompat。
      • 我添加了 v4 库,但它仍然显示 => ActivityCompat 类型的方法 requestPermissions(String[], int) 未定义
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 2022-01-12
      • 1970-01-01
      • 2023-02-10
      • 2011-02-17
      相关资源
      最近更新 更多