我的应用程序无法在API 23中运行

时间:2016-02-25 18:05:30

标签: android api listview notifications audio-player android-music-player

音乐应用<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23" />,适用于API 16,但不适用于API 23.

列表视图未加载歌曲,在API23中检查时显示为空,在API16中正常工作。

在API22中也正常工作

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

public class PlayListActivity extends ListActivity {
    // Songs list
    public ArrayList<HashMap<String, String>> songsList = new ArrayList<HashMap<String, String>>();

    SearchView sv;
    ListView lv;
    SimpleAdapter adapter;
    ArrayList<HashMap<String, String>> songsListData = new ArrayList<>();
    int songIndex;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.playlist);

        sv = (SearchView)findViewById(R.id.searchView);
        int id = sv.getContext().getResources().getIdentifier("android:id/search_src_text", null, null);
        TextView textView = (TextView) sv.findViewById(id);
        textView.setTextColor(Color.WHITE);
        textView.setHintTextColor(Color.LTGRAY);

        SongsManager plm = new SongsManager();
        // get all songs from sdcard
        this.songsList = plm.getPlayList(Environment.getExternalStorageDirectory());

        if(songsList!=null && songsList.size()>0) {
            // looping through playlist
            for (int i = 0; i < songsList.size(); i++) {
                // creating new HashMap
                HashMap<String, String> song = songsList.get(i);

                // adding HashList to ArrayList
                songsListData.add(song);
            }

            // Adding menuItems to ListView
             adapter = new SimpleAdapter(this, songsListData,
                    R.layout.playlist_item, new String[]{"songTitle"}, new int[]{
                    R.id.songTitle});


            setListAdapter(adapter);

            sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    return false;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    adapter.getFilter().filter(newText);
                    return false;
                }
            });
            // selecting single ListView item
             lv = getListView();

            // register for context menu
            registerForContextMenu(lv);

            // listening to single listitem click
            lv.setOnItemClickListener(new OnItemClickListener() {

                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {
                    // getting listitem index
                    songIndex = position;

                    // Starting new intent
                    Intent in = new Intent(getApplicationContext(),
                            MainActivity.class);
                    // Sending songIndex to PlayerActivity
                    in.putExtra("songIndex", songIndex);
                    setResult(100, in);
                    // Closing PlayListView
                    finish();
                }
            });
        }

        sv.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(final View view, boolean hasFocus) {
                if (hasFocus) {
                    view.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                            imm.showSoftInput(view.findFocus(), 0);
                        }
                    }, 200);
                }
            }
        });
    }
    //ListView listView = (ListView)findViewById(android.R.id.list);
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.playlist_contextmenu,menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

        switch (item.getItemId()){

            case R.id.delete_id:
                songsListData.remove(info.position);
                String path =  songsList.get(info.position).get("songPath");
                File filepath = new File(path);
                filepath.delete();
                adapter.notifyDataSetChanged();
                return true;
            default:
                return super.onContextItemSelected(item);
        }

    }
}

即使通知图标未显示,也会显示空图标 我使用了NotificationCompat.Builder

的ListView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">
    <SearchView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/searchView"
        android:background="#242424" //black colour
        android:queryHint="Search...">
    </SearchView>
    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:divider="@drawable/gradient_horizontal_line"
        android:dividerHeight="1dp"
        android:listSelector="@drawable/list_selector" // balck colour
        android:background="@drawable/list_selector"/>

</LinearLayout>

列出项目

<?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"
    android:orientation="vertical"
    android:gravity="center"
    android:background="@drawable/list_selector"
    android:foreground="#EBEBEB"
    android:padding="5dp">
    <!--android:background="@drawable/list_selector"-->
    <TextView 
        android:id="@+id/songTitle"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="16dp"
        android:padding="10dp"
        android:background="@drawable/list_selector"
        android:textColor="#FFFFFF"/>  // white colour
    <!--android:color="#f3f3f3"-->
</LinearLayout>

list_selector

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Selector style for listrow -->

    <item 
     android:state_selected="false"
        android:state_pressed="false" 
        android:drawable="@drawable/gradient_bg" />
    <item android:state_pressed="true" 
        android:drawable="@drawable/gradient_bg_hover" />
    <item android:state_selected="true"
     android:state_pressed="false" 
        android:drawable="@drawable/gradient_bg_hover" />
    </selector>

Styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

    <style name="btnStyleBlackpearl" parent="@android:style/Widget.Button">
        <item name="android:textSize">15sp</item>
        <item name="android:textStyle">bold</item>
        <item name="android:textColor">#C4C4C4</item>
        <item name="android:gravity">center</item>
        <item name="android:shadowColor">#000000</item>
        <item name="android:shadowDx">1</item>
        <item name="android:shadowDy">1</item>
        <item name="android:shadowRadius">0.6</item>
        <item name="android:background">@drawable/custom_btn_black_pearl</item>
        <item name="android:padding">10dip</item>
    </style>

</resources>

请指导..

API 16 - 正常工作

API 23 - 无效 - 在模拟器中打开存储权限后 enter image description here

5 个答案:

答案 0 :(得分:1)

要进行快速修复:在设备/模拟器上转到Settings -> Apps -> Your App -> Permissions,并确保已选中Storage。从长远来看,您希望使用API​​ 23中添加的新API将您的应用设为request permissions at run time

答案 1 :(得分:0)

您应该在MarshMallow设备中以编程方式处理存储权限。

答案 2 :(得分:0)

  • 嘿,检查你的风格。
  • 提供api图片时,您的列表颜色不同。
  • 我认为列表项文字颜色为 WHITE ,因此在api 23中不可见。
  • 尝试改变颜色,我确定它能够正常工作。

*注意 - 请保留所有api中类似的主题。

答案 3 :(得分:0)

我认为textColor是白色的。所以你无法看到行项目。你可以改变文字颜色,一切都会正常工作

古德勒克!

答案 4 :(得分:0)

我发现了问题,它是列表项线性布局中的白色android:foreground="#EBEBEB"