2017-06-29 58 views
0

我试图在Android代码中打印json回显的方法;但不只是一个简单的回声,而是一个admob代码;让AdMob广告单元将在服务器JSON文件和我叫它为Android的代码如下:JSON文件是如下:在Android应用上打印PHP Echo

{ 
"ads":{  
    "inter":"ca-app-pub-3940256099942544/1033173712" 
} 
} 

是否有可能做到这一点?所以我可以从服务器中的文件更改admob代码,而无需更新商店中的应用程序? 如果是这样的话,android代码将负责将该字符串提取到应用程序中。

我的代码是这样的:

public class MainActivity extends AppCompatActivity { 
private RecyclerView mRecyclerView; 
private RecyclerView.LayoutManager mLayoutManager; 

private List<Song> songList; 
private SongAdapter songAdapter; 

// URL of object to be parsed 
String JsonURL = "http://xxxxx.com/ads.json"; 
// This string will hold the results 
String data = ""; 
RequestQueue requestQueue; 
//TODO: full screen ad 
private InterstitialAd mInterstitialAd; 
//TODO: selected item 
private int mPosition; 

String[] names = {"test1", "test2", "test3", "test4", "test5", "test6"}; 

String[] singers = {"test1", "test2", "test3", "test4", "test5", "test6"}; 

int[] pics = { 
     R.drawable.tip1, 
     R.drawable.tip1, 
     R.drawable.tip1, 
     R.drawable.tip1, 
     R.drawable.tip1, 
     R.drawable.tip1}; 



@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
    setupActionBar(); 

    requestQueue = Volley.newRequestQueue(this); 
    JsonObjectRequest obreq = new JsonObjectRequest(Request.Method.GET, JsonURL, 
      new Response.Listener<JSONObject>() { 
       @Override 
       public void onResponse(JSONObject response) { 
        try { 
         JSONObject obj = response.getJSONObject("ads"); 

         String Inter = obj.getString("inter"); 
         data = Inter; 

        } 
        catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
      }, 
      new Response.ErrorListener() { 
       @Override 
       public void onErrorResponse(VolleyError error) { 
        Log.e("Volley", "Error"); 
       } 
      } 
    ); 
    requestQueue.add(obreq); 

    //Use this setting to improve performance if you know that changes in 
    //the content do not change the layout size of the RecyclerView 
    if (mRecyclerView != null) { 
     mRecyclerView.setHasFixedSize(true); 
    } 

    //using a linear layout manager 
    mLayoutManager = new LinearLayoutManager(this); 

    //use this in case of gridlayoutmanager 
    //mLayoutManager = new GridLayoutManager(this,2); 

    //use this in case of Staggered GridLayoutManager 
    //mLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL); 


    mRecyclerView.setLayoutManager(mLayoutManager); 

    //intializing an arraylist called songlist 
    songList = new ArrayList<>(); 

    //adding data from arrays to songlist 
    for (int i = 0; i < names.length; i++) { 
     Song song = new Song(names[i], singers[i], i + 1, pics[i]); 
     songList.add(song); 
    } 
    //initializing adapter 
    songAdapter = new SongAdapter(songList); 

    //specifying an adapter to access data, create views and replace the content 
    mRecyclerView.setAdapter(songAdapter); 
    songAdapter.notifyDataSetChanged(); 

    mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() { 

     @Override 
     public void onItemClick(View view, int position) { 
      // TODO: check condition it should whether show ad or not 
      Integer[] adPositions = {1,2}; // list of ad positions 

      if (!Arrays.asList(adPositions).contains(position)) { 
       goToItem(position); 
       return; 
      } 

      // TODO: check ad is loaded before showing 
      if (mInterstitialAd.isLoaded()) { 
       mPosition = position; 
       mInterstitialAd.show(); 
      } else { 
       goToItem(position); 
      } 
     } 
    })); 


    // TODO:init ad 
    mInterstitialAd = new InterstitialAd(this); 
    mInterstitialAd.setAdUnitId(data); 
    mInterstitialAd.setAdListener(new AdListener() { 
     @Override 
     public void onAdClosed() { 
      requestNewInterstitial(); 
      goToItem(mPosition); 
     } 
    }); 

    //TODO: load new ad 
    requestNewInterstitial(); 
} 

//TODO: load new ad 
private void requestNewInterstitial() { 
    AdRequest adRequest = new AdRequest.Builder() 
      .build(); 
    mInterstitialAd.loadAd(adRequest); 
} 

//TODO: open item at position 
private void goToItem(int position) { 
    switch (position) { 
     case 0: 
      startActivity(new Intent(MainActivity.this, Test1Activity.class)); 
      break; 
     case 1: 
      startActivity(new Intent(MainActivity.this, Test2Activity.class)); 
      break; 
     case 2: 
      startActivity(new Intent(MainActivity.this, Test3Activity.class)); 
      break; 
     case 3: 
      startActivity(new Intent(MainActivity.this, Test4Activity.class)); 
      break; 
     case 4: 
      startActivity(new Intent(MainActivity.this, Test5Activity.class)); 
      break; 
     case 5: 
      startActivity(new Intent(MainActivity.this, Test6Activity.class)); 
      break; 
     default: 
      break; 
    } 
} 

private void setupActionBar() { 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     // Show the Up button in the action bar. 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    int id = item.getItemId(); 
    if (id == android.R.id.home) { 
     finish(); 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 



} 

编辑

的代码工作正常,除了一件事是应用程序崩溃(有时)当我点击打开要展示活动插入到项目之前的插页式代码。我不希望应用程序崩溃了。

我认为有时无法连接到服务器多数民众赞成为什么它崩溃(这只在间隙)nativeExpress总是罚款连接与否。

我不希望应用程序崩溃了,有无论如何验证连接到服务器,或强制它首先连接到服务器,如果成功>加载>显示 如果不连接到服务器只是忽略并转到项目。

+0

漂亮stamdard调用Android中的代码PHP脚本,并阅读其回声。有什么问题? – greenapps

+0

谢谢你回答,问题是我没有关于如何做到这一点的知识,我在这里试过这种方式,但无法弄清楚它https://stackoverflow.com/questions/22177821/how-doi-i-打印php-echo-on-my-android-app,你能帮我一个代码吗 – user2972389

回答

0

echo在PHP中通过HTTP(S)连接向客户端发送文本。

所以,据我所知,你想从你的服务器检索admob id来显示使用特定id值的admob横幅。

检索一些数据,你可以使用任何你想要的库。

例如,排LIB https://developer.android.com/training/volley/simple.html

final TextView mTextView = (TextView) findViewById(R.id.text); 
... 

// Instantiate the RequestQueue. 
RequestQueue queue = Volley.newRequestQueue(this); 
String url ="http://www.google.com"; 

// Request a string response from the provided URL. 
StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
      new Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     // Display the first 500 characters of the response string. 
     mTextView.setText("Response is: "+ response.substring(0,500)); 
    } 
}, new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     mTextView.setText("That didn't work!"); 
    } 
}); 
// Add the request to the RequestQueue. 
queue.add(stringRequest); 

,或者JSOUP库https://jsoup.org/download

`compile 'org.jsoup:jsoup:1.10.2'` 

用法

Document doc = Jsoup.connect(URL).get();

EDIT

我想说,只有在检索data变量(即admob键)后,您才必须初始化插页式广告。

我现在的代码,你试图在检索到回调之前,尝试inialize interstital。

我能建议什么?

在成功回调中移动初始化。

即,

@Override 
       public void onResponse(JSONObject response) { 
        try { 
         JSONObject obj = response.getJSONObject("ads"); 

         String Inter = obj.getString("inter"); 
         data = Inter; 
//HERE YOU NEW CODE 

mInterstitialAd = new InterstitialAd(this); 
mInterstitialAd.setAdUnitId(data); 
mInterstitialAd.setAdListener(new AdListener() { 
    @Override 
    public void onAdClosed() { 
     requestNewInterstitial(); 
     goToItem(mPosition); 
    } 
}); 

requestNewInterstitial(); 

// NEW CODE } 赶上(JSONException E){e.printStackTrace 结束(); }}

不要忘了,从以前的位置删除此注射;)

+0

我跟着这里的教程https://www.thorntech.com/2016/03/parsing-json-android-using-排除库/不使用textview方法,但只是给调用admob id并给它一个变量,然后在admob代码中使用该变量,但没有奏效。但是当我把代码直接放在持有人数据=“xxxxx”的时候,所以它看起来像代码不能解析持有人data =“”中的admob id,请你帮忙请 – user2972389

+0

@ user2972389请发表你的android代码和http服务器响应。 – Vyacheslav

+0

Part1: String JsonURL =“http://xxxxxx.com/ads.json”; //此字符串将保存结果 String data =“”; RequestQueue requestQueue; – user2972389